1. 程式人生 > >2017校招去哪網,阿里,網易,中興,華為筆試程式設計題五則(Python描述)

2017校招去哪網,阿里,網易,中興,華為筆試程式設計題五則(Python描述)

前言

學長忙著找工作,今天幾輪筆試,把能拍到的筆試題都給我寫了寫,我想對明年找工作或者實習有所幫助

第一題,去哪網筆試題

題目我個人感覺難度還可以,我自己寫了好久,三道題,一道重複,還有一題同學沒拍到,總共時間給兩個小時,時間給的久,相比有點道理。

這裡寫圖片描述

估計讀題目就刷掉個一半了。。。。簡單說一下(我同學翻譯的,我自己懶得看),就是說,給定一串字串,給定個分割閾值,然後進行分割,要是分割邊界切壞了一個單詞,那麼切割按照安全距離切割,即放棄切割到的單詞,然後切割到的單詞重新當做切割起始點,再進行閾值進行切割,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學習真正學以致用而得到學長誇獎,哈哈。挺開心的。以此記錄。