2022年7月20号HW机试真题

第一题

考试的时候用了低级解法,提示超过了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))

猜你喜欢

转载自blog.csdn.net/qq_33757398/article/details/125903868