2017校招去哪網,阿里,網易,中興,華為筆試程式設計題五則(Python描述)
阿新 • • 發佈:2019-01-30
前言
學長忙著找工作,今天幾輪筆試,把能拍到的筆試題都給我寫了寫,我想對明年找工作或者實習有所幫助
第一題,去哪網筆試題
題目我個人感覺難度還可以,我自己寫了好久,三道題,一道重複,還有一題同學沒拍到,總共時間給兩個小時,時間給的久,相比有點道理。
估計讀題目就刷掉個一半了。。。。簡單說一下(我同學翻譯的,我自己懶得看),就是說,給定一串字串,給定個分割閾值,然後進行分割,要是分割邊界切壞了一個單詞,那麼切割按照安全距離切割,即放棄切割到的單詞,然後切割到的單詞重新當做切割起始點,再進行閾值進行切割,ok,應該能理解吧。
程式碼實現
import math
part1=[]
def test(str1,n):
str1 = str1+' '*((len(str1)/n+1)*n-len(str1))
#先找到切割會碰到單詞的片,確定為第幾片段
k =1
while 1:
try:
if str1[(k)*n-1] !=' ' and str1[(k)*n]!=' ' :
break
else:
k = k+1
except:
part1.append(str1[(k-1 )*n:].strip())
break
# 遇到切到單詞的片段,之前的片段都可直接分割
for i in range(k-1):
part1.append(str1[(i)*n:(i+1)*n].strip())
# 從切割遇到問題的片段開始,專門處理片段
try:
j = 2
while 1:
# 找出問題的單詞邊界在哪
if str1[(k)*n-j] ==' ':
part1.append(str1[(k-1 )*n:(k)*n-j].strip())
str1 = str1[(k)*n-j+1:] #分割點建立新的字串
str1 = str1.strip() #去掉邊界空格
if len(str1.strip())>=n:
str1 = str1+' '*(int(math.ceil(float(len(str1))/7))-(len(str1)/7))
test(str1,n) #遞迴
else:
#如果到了尾巴,結尾
part1.append(str1)
break
break
else:
j = j+1
except:
print 'Oops!'
return part1
strings = raw_input("enter the strings you want to split:")
blank = input("enter the between-segment distance:")
part = test(strings,blank)
result = []
#去除多餘空格
for i in range(len(part)):
if part[i]=='':
pass
else:
result.append(part[i])
print result
測試官方圖
自己進行驗證
測試一:官方資料
enter the strings you want to split:Our world is but a small part of the cosmos.
enter the between-segment distance:9
['Our world', 'is but a', 'small', 'part of', 'the', 'cosmos.']
測試二:自己隨機字串
enter the strings you want to split:I LOVE CSDN AND Janshu
enter the between-segment distance:6
['I LOVE', 'CSDN', 'AND', 'Janshu']
測試三
enter the strings you want to split:this is a test! it costs three hours!
enter the between-segment distance:6
['this', 'is a', 'test!', 'it', 'costs', 'three', 'hours!']
應該是正確的把,我感覺,畢竟自己花了好多時間寫的。。
第二題,阿里的筆試題
感覺相當簡單,兩三分鐘完事,但是反正筆試過了面試一樣被虐,別緊張。。。。。
直接上題目
直接上程式碼
str1 = raw_input("enter the string:")
result = []
result2 = []
result_str=''
k = 0
for i in range(len(str1)):
if str1[i] == '*':
result.append("*")
k = k+1
else:
result2.append(str1[i])
for i in range(len(result2)):
result.append(result2[i])
for i in range(len(result)):
result_str = result_str+result[i]
print "result:%s\\\\n \\\\"* \\\\"number:%d"%(result_str,k)
測試結果
enter the string:ab**cd**e*12
result:*****abcde12
"* "number:5
第三題,蜜蜂匯金
找出一個列表中只出現一次的數,比如輸入列表[1,2,1,1,2,2,4],找出4即可,簡單的,直接構建字典,填充值出現次數之後檢索一下就可以
程式碼
list1 = [9,1,1,2,2,3,74,1,5,52,3,3,4,4,4,2,5,1,1,1,]
dict1 = {}
k = 0
for i in list1:
if i not in dict1:
dict1[i] = 0
dict1[i] +=1
print dict1
for value in dict1.values():
if value == 1:
print dict1.keys()[k]
k=k+1
else:
k =k+1
測試結果
{1: 6, 2: 3, 3: 3, 4: 3, 5: 2, 9: 1, 74: 1, 52: 1}
9
74
52
第四題,中興的筆試題
題目
程式碼
import re
def f(num):
g = 0
a = list(str(num))
for i in range(len(a)):
g = int(a[i])+g
return g
def g(n):
c = bin(n)
d = re.sub('0b','',c)
e = f(d)
return e
n = input("please enter n: ")
x=0
for i in range(1,n+1):
if g(i)==f(i):
x = x+1
else:
x=x
print x
測試
please enter n: 21
3
第五題,網易筆試題
題目大意是:給定一個數n,計算n與斐波那契數的最小差值。
首先,斐波那契數沒給,這個基礎在資料結構裡出現比較多,不知道的這裡有,是這樣的序列:1,1,2,3,5,8,13,21,,,,等
程式碼
n = input("enter the n :")
k = n
if k in [1,2,3,5]:
print "the answer is 0 "
else:
i = 1
j = 1
mins_list = []
while k>=3:
x = i+j
i = j
j = x
mins_list.append(abs(n-x))
k = k-1
print "the answer is:%s"%(min(mins_list))
結果就是
enter the n :15
the answer is:2
第六題,華為筆試題
題目
整數之迴圈節點求和
描述:
任意一個不是用完全相同數字組成的四位數,如果對它們的每位數字重新排序,組成一個較大的數和一個較小的數,然後用較大數減去較小數,差不夠四位數時在前面補零,類推下去,最後將變成一個固定的數:6174。
例如:4321-1234=3087 8730-378=8352 8532-2358=6174 7641-1467=6147。
如果K位數也照此辦理,它們不是變成一個數,而是在幾個數字之間形成迴圈,例如對於五位數54321: 54321-12345=41976 97641-14679=82962 98622-22689=75933 97533-33579=63954 96543-34569=61974 97641-14679=82962
我們把82962 75933 63954 61974稱作迴圈節。在前面6174中,迴圈節認為只有一個數。
請輸出這些迴圈節之和,最終結果可能需要使用64位的整型才能存放。當沒有迴圈節,輸出0,例如:輸入33333,輸出0。
執行時間限制: 無限制
記憶體限制: 無限制
輸入:
輸入為一個正整數,取值範圍位0~0xffffffff
輸出:
輸出為各迴圈節的和
樣例輸入:
3214
樣例輸出:
6174
程式碼
#思路是先字串轉化數值儲存列表,之後排序生成新的數值,做差,之後迭代就可以,最後寫個清洗函式,把列表整理一下,做些後續處理即可,難度不大,思路要清晰
# 最大值減去最小值
def sub(num):
list_str = list(num)
list_num = []
str_min =''
str_max =''
for i in list_str:
list_num.append(int(i))
list_num_b = sorted(list_num)
for i in list_num_b:
str_min = str_min+str(i)
str_max = str(i)+str_max
num2 = int(str_max)-int(str_min)
return str(num2)
#迭代計算
def main_cal(num):
list_store = []
result =''
while (result) not in list_store:
list_store.append((result))
result = sub(num)
num = result
del list_store[0] #刪除第一個空格元素
return list_store,result
# 清洗資料,生成最終環節列表
def clean(list_store,result_last):
list_end =[]
result_last = int(result_last)
for i in range(len(list_store)):
list_end.append(int(list_store[i]))
# 使用index方法,找到符合的數所在的位置,開始擷取
list_index = list_end.index(result_last)
list_end = list_end[list_index:]
return list_end
'''
# 方法二,用遍歷的方法找到符合數所在的位置
k = 0
for j in list_end:
if j == result_last:
list_end = list_end[k:]
else:
k = k+1
'''
num = raw_input("enter the number:")
list_store,result_last = main_cal(num)
list_end = clean(list_store,result_last)
answer = 0
for i in range(len(list_end)):
answer += list_end[i]
print "環節列表:",list_end
print "the answer is :",answer
# python2.4版本以後,如果int的值超出範圍不會溢位,而是內部轉換為long,所以不用考慮溢位
測試結果
enter the number:6662
環節列表: [6174]
the answer is : 6174
enter the number:4321
環節列表: [6174]
the answer is : 6174
enter the number:3333
環節列表: [0]
the answer is : 0
enter the number:54321
環節列表: [82962, 75933, 63954, 61974]
the answer is : 284823
總結
去哪網的筆試題難度較大,思路誰都有,但是正真寫出來的時候錯誤一堆,經過除錯才最終成功的,自己的程式碼能力還有待提升,但也不枉費時間來訓練自己,還有,這是第一次,三個月的python學習真正學以致用而得到學長誇獎,哈哈。挺開心的。以此記錄。