小白的秋招記錄——機試刷題(華爲研發工程師編程題)

 

1、汽水瓶

時間限制:1秒

空間限制:32768K

有這樣一道智力題:“某商店規定:三個空汽水瓶可以換一瓶汽水。小張手上有十個空汽水瓶,她最多可以換多少瓶汽水喝?”答案是5瓶,方法如下:先用9個空瓶子換3瓶汽水,喝掉3瓶滿的,喝完以後4個空瓶子,用3個再換一瓶,喝掉這瓶滿的,這時候剩2個空瓶子。然後你讓老闆先借給你一瓶汽水,喝掉這瓶滿的,喝完以後用3個空瓶子換一瓶滿的還給老闆。如果小張手上有n個空汽水瓶,最多可以換多少瓶汽水喝? 

輸入描述:

輸入文件最多包含10組測試數據,每個數據佔一行,僅包含一個正整數n(1<=n<=100),表示小張手上的空汽水瓶數。n=0表示輸入結束,你的程序不應當處理這一行。

輸出描述:

對於每組測試數據,輸出一行,表示最多可以喝的汽水瓶數。如果一瓶也喝不到,輸出0。

輸入例子:

3

10

81

0

輸出例子:

1

5

40

代碼: 

#遞歸
import sys
def get_total_drinks(total, empty):
    if empty < 2:       #如果有0或1個空瓶,不能兌換飲料
        return total
    if empty in [2,3]:  #如果有2或3個空瓶,可以兌換一瓶
        return total+1
    new = empty / 3
    return get_total_drinks(total+new, empty-3*new+new)  #目前的總飲料數,總空瓶數

try:
    while True:
        line = sys.stdin.readline().strip()
        if line == '0':
            break
        empty = int(line)
        total = 0
        print get_total_drinks(total,empty)
except:
    pass

 

2、明明的隨機數

時間限制:1秒

空間限制:32768K

明明想在學校中請一些同學一起做一項問卷調查,爲了實驗的客觀性,他先用計算機生成了N個1到1000之間的隨機整數(N≤1000),對於其中重複的數字,只保留一個,把其餘相同的數去掉,不同的數對應着不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成“去重”與“排序”的工作(同一個測試用例裏可能會有多組數據,希望大家能正確處理)。

Input Param

n               輸入隨機數的個數

inputArray      n個隨機整數組成的數組

Return Value

OutputArray    輸出處理後的隨機整數

注:測試用例保證輸入參數的正確性,答題者無需驗證。測試用例不止一組。

輸入描述:

輸入多行,先輸入隨機整數的個數,再輸入相應個數的整數

輸出描述:

返回多行,處理後的結果

輸入例子1:

11

10

20

40

32

67

40

20

89

300

400

15

輸出例子1:

10

15

20

32

40

67

89

300

400

代碼:

#輸入到list
#list轉化爲集合
#集合排序,輸出
import sys
try:
    while True:
        line = sys.stdin.readline().strip()
        if line == '':
            break
        num = int(line)
        l= []
        for i in range(num):
            l.append(int(sys.stdin.readline().strip()))
        s = set(l)
        sort_s = sorted(s)
        for i in sort_s:
            print i
except:
    pass

 

3、進制轉換

時間限制:1秒

空間限制:32768K

寫出一個程序,接受一個十六進制的數值字符串,輸出該數值的十進制字符串。(多組同時輸入 )

輸入描述:

輸入一個十六進制的數值字符串。

輸出描述:

輸出該數值的十進制字符串。

輸入例子1:

0xA

輸出例子1:

10

代碼: 

import sys

def get_ten(s):
    base = 1
    value = 0
    for i in s[::-1]:
        if ord(i) - ord('0') < 10:      #該位爲數組
            value += int(i)*base
        else:                           #該位位字母
            value += (10 + ord(i) - ord('A'))*base
        base *= 16
    print value

try:
    while True:
        line = sys.stdin.readline().strip()
        if line == '':
            break
        get_ten(line[2:])
except:
    pass

 

評價:

華爲的題確實是刷的題中最簡單的題,感覺三道題都很基礎,沒有什麼特別的套路,但是一個小時依舊做不完三道,我目前好像只能做兩道。。。。。

 

編程語言: python2.7.3

python2的輸入輸出太噁心了,賊複雜,稍微簡寫一點就報錯。。。。。。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章