第一题
考试的时候用了低级解法,提示超过了CPU限制,不知道是不是超时导致的,通过率只有68%
number = int(input().strip())
# 输入范围判断
if number < 0 or number > 10**10:
print(-1)
exit()
# 初始化输出
res = 0
### 低级解法
# 遍历整数,如果number=36,那整个循环了36次
# 考试的时候超时了
# for i in range(number+1):
# binary = bin(i)[2:]
# if binary[0] == '0': continue
# if len(binary) % 2 != 0: continue
# pairs = len(binary) // 2
# if binary[:pairs] == binary[pairs:]:
# res += 1
### 高级解法
# 遍历二进制
# 比上面高效,当number=36时,只用遍历4次
i = 1 # 从1开始
binary = bin(i)
doubleBinary = binary + binary[2:]
while int(doubleBinary, 2) <= number:
if binary[2] == '1':
res += 1
i += 1
binary = bin(i)
doubleBinary = binary + binary[2:]
print(res)
第二题
不知道为啥,自己觉得没问题的解法却没有通过
没想明白,最后通过率只有45%
# strInput = input().strip()
# strInput = "2+3-(5+2)" # -2
# strInput = "2+3-(-5+2)" # 8
strInput = "2+3-(5-(4+(7-9)))" # 2
def compute(strStack):
strStack += '+' # 为了数字和符号配对
# e.g., strStack=['5', '+', '2', '+']
# 解决负负得正的问题
strStack = ''.join(strStack)
strStack = strStack.replace('--', '+')
strStack = strStack.replace('++', '+')
strStack = strStack.replace('-+', '-')
strStack = strStack.replace('+-', '-')
strStack = list(strStack)
nums = []
number = ""
if strStack[0] == '-': strStack = ['0'] + strStack
flag = False
while strStack:
val = strStack.pop(0)
if val != '+' and val != '-':
number += val
else:
try: number = int(number)
except: number = 0
if flag: nums.append(-number)
else: nums.append(number)
if val == '-': flag = True
else: flag = False
number = ""
return sum(nums)
stack = []
for v in strInput:
if v == ')':
temp_stack = []
while stack:
val = stack.pop()
if val != '(':
temp_stack.append(val)
else:
break
resTmp = compute(temp_stack[::-1])
resTmp = str(resTmp)
for vT in resTmp:
stack.append(vT)
else:
stack.append(v)
res = compute(stack)
print(res)
第三题
# pod, node1, node2 = map(int, input().strip().split(','))
pod, node1, node2 = 4, 1, 15
# 为了满足所有节点从0开始计数,方便后面的取商和取余
node1 -= 1
node2 -= 1
# A B C层的节点数量
ALayer = BLayer = CLayer = pod // 2
# 计算第一个节点的位置
# 即第几个pod,第几个节点pos,第几个A层
pod1 = node1 // pod # 0
pos1 = node1 % pod # 0
A1 = pod1 * ALayer + pos1 // ALayer
# 计算第二个节点的位置
# 即第几个pod,第几个节点pos,第几个A层
pod2 = node2 // pod # 3
pos2 = node2 % pod # 2
A2 = pod2 * ALayer + pos2 // ALayer
if pod1 == pod2 and A1 == A2:
# 在同一个A节点上
print("[A%d]" % (A1+1))
elif pod1 == pod2 and A1 != A2:
# 不在同一个A节点上
# 结果为AB之间的全连接路径
for i in range(BLayer):
B = pod1 * BLayer + i
print("[A%d B%d A%d]" % (A1+1, B+1, A2+1))
else:
# 不在一个pod下
for i in range(BLayer):
# 这里有一个规律就是
# 两个B节点是同一SET下才可达
B1 = pod1 * BLayer + i
B2 = pod2 * BLayer + i
for j in range(CLayer):
# 遍历C层
C = (B1 % (pod * ALayer)) * CLayer + j
print("[A%d B%d C%d B%d A%d]" %
(A1+1, B1+1, C+1, B2+1, A2+1))