百度2016笔试(算法春招实习)

4.23 10:00更新,编程题1的Python实现,仅供参考。源码见页尾

4.23 20:35更新,编程题2的Python实现。源码见尾页

百度的题还是非常偏重算法的,整体来讲难度比较高,尤其是编程题,下面附上原题:


选择题

百度2016笔试(算法春招实习)_第1张图片

百度2016笔试(算法春招实习)_第2张图片

百度2016笔试(算法春招实习)_第3张图片

百度2016笔试(算法春招实习)_第4张图片

百度2016笔试(算法春招实习)_第5张图片

百度2016笔试(算法春招实习)_第6张图片

百度2016笔试(算法春招实习)_第7张图片

百度2016笔试(算法春招实习)_第8张图片

百度2016笔试(算法春招实习)_第9张图片

百度2016笔试(算法春招实习)_第10张图片

百度2016笔试(算法春招实习)_第11张图片

百度2016笔试(算法春招实习)_第12张图片

百度2016笔试(算法春招实习)_第13张图片

百度2016笔试(算法春招实习)_第14张图片

百度2016笔试(算法春招实习)_第15张图片

百度2016笔试(算法春招实习)_第16张图片

百度2016笔试(算法春招实习)_第17张图片

百度2016笔试(算法春招实习)_第18张图片

百度2016笔试(算法春招实习)_第19张图片

百度2016笔试(算法春招实习)_第20张图片

百度2016笔试(算法春招实习)_第21张图片

百度2016笔试(算法春招实习)_第22张图片


问答题


主观题

百度2016笔试(算法春招实习)_第23张图片


编程题

百度2016笔试(算法春招实习)_第24张图片

百度2016笔试(算法春招实习)_第25张图片

百度2016笔试(算法春招实习)_第26张图片

百度2016笔试(算法春招实习)_第27张图片

百度2016笔试(算法春招实习)_第28张图片

百度2016笔试(算法春招实习)_第29张图片


编程题1源码

#coding:utf-8

data = []

# 处理输入
while True:
    item = []
    theString = ''
    theString = raw_input() # theString = '(??)'
    if len(theString) == 0:
        break
    else:
        item.append(theString)
        for i in range(theString.count('?')):
            aibi = raw_input() # '1 2'
            ai = int(aibi.split(' ')[0])
            bi = int(aibi.split(' ')[1])
            aibi = []
            aibi.append(ai); aibi.append(bi) # aibi = [1,2]
            item.append(aibi) # item = [['(??)'], [1,2], [2,8]]
    data.append(item) #data = [  ['(??)', [1,2], [2,8]], ......  ]

# 生成所有括号的可能性
def allThePosibility(theString,data):
    # 对于该问号有改成)和(这两种可能
    if theString.count('?') == 0:
        data.append(theString)
    else:
        theStringToLeft = ''
        theStringToRight = ''
        theIndex = theString.index('?') # 第一个问号的位置
        theStringToLeft = theString[:theIndex] + '(' + theString[theIndex+1:]
        #print theStringToLeft
        theStringToRight = theString[:theIndex] + ')' + theString[theIndex + 1:]
        #print theStringToRight
        allThePosibility(theStringToLeft,data)
        allThePosibility(theStringToRight,data)
        return data # ['((()', '(())', '()()', '()))']

# 是否正则化
def isRegularization(theString): # theString = '((()'
    if theString.count('(') != theString.count(')'):
        return 0
    stack = []  # 设置一个栈
    for alphabet in theString:
        if alphabet == ')' and stack == []:
            return 0
        else:
            if alphabet == '(':
                stack.append(0) # 入栈
            else: # 遇到右括号
                stack.pop() # 出栈
    if stack != []:
        return 0
    else:
        return theString

# 每个问号的位置
def positionOfQuestionMark(theString): # theString = '(??)'
    i = 0
    position = []
    while True:
        if '?' in theString[i:]:
            theIndex = theString[i:].index('?') # 更新下一个问号的位置
            i += theIndex
            position.append(i)
            i += 1
        else:
            break
    return position # [1,2]

# 处理数据
for item in data: # item = ['(??)', [1,2], [2,8]]

    regularzations = []

    # 所有括号的位置
    position = positionOfQuestionMark(item[0]) # position = [1,2]
    # 列出所有能加括号的情况
    posibilities = allThePosibility(item[0], data=[]) # posibilities = ['((()', '(())', '()()', '()))']
    # 所有能正则化的情况
    for theString in posibilities:
        if isRegularization(theString) != 0:
            regularzations.append(theString) # regularzations = ['(())', '()()']
    if regularzations == []: # 没有正则化
        print -1
        break

    # 计算最小代价
    minValue = 9999
    minValueReg = ''
    for reg in regularzations: # reg = '(())'
        value = 0
        flag = 1
        for i in position:
            if reg[i] == '(':
                value += item[flag][0] # 加上左括号的代价
            else: # ')'
                value += item[flag][1] # 加上右括号的代价
            flag += 1
        if value < minValue:
            minValue = value
            minValueReg = reg
    print minValue
    print minValueReg



编程题2

#coding:utf-8

# 百度笔试题2

# 先处理输入
theString = raw_input()
base = int(theString.split(' ')[0]) # string型
luckyNum = int(theString.split(' ')[1]) # string型

if base < luckyNum:
    print luckyNum
elif base > luckyNum and len(str(base)) > len(str(luckyNum)):
    x = len(str(luckyNum)) # 幸运数的位数
    if int(str(base)[len(str(base)) - x : ]) <= luckyNum: # 如果base的后x位小于等于幸运数
        print str(base)[:len(str(base)) - x] + str(luckyNum)
    else: # base的后x为大于幸运数
        tagNum = int(str(base)[len(str(base)) -x -1:len(str(base)) -x]) # base比x高一位的数,int型
        tagNum += 1
        answer = (str(base)[:len(str(base)) - x - 1]) + str(tagNum) + str(luckyNum)
        print answer
elif base > luckyNum and len(str(base)) == len(str(luckyNum)):
    # 在luckNum的左面写个1就行了
    print '1' + str(luckyNum)


你可能感兴趣的:(面试)