4.23 10:00更新,编程题1的Python实现,仅供参考。源码见页尾
4.23 20:35更新,编程题2的Python实现。源码见尾页
百度的题还是非常偏重算法的,整体来讲难度比较高,尤其是编程题,下面附上原题:
选择题
问答题
主观题
编程题
编程题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)