1. 程式人生 > >【VMware】 2019校招線上考試 (python)(數量有限的最少硬幣問題、還能拖多久、最大整數)

【VMware】 2019校招線上考試 (python)(數量有限的最少硬幣問題、還能拖多久、最大整數)

1.硬幣個數有限,要求用最少的硬幣找錢。

硬幣個數有限,要求用最少的硬幣找錢。
假設各種硬幣面值t[i](順排),個數c[i]a[i][j]為用t[0]..t[i]面值的硬幣找錢j的最少硬幣個數。
a[i][j] = min{k + a[i - 1][j – k * t[i]]}, 0 <= k <= c[i] 相當於遍歷第 i 種硬幣的可能性。

t=[1,2,5]	#硬幣面值
c=[2,3,2]	#硬幣個數
def work(s):
    n=s+1
    a=[[0 for col in range(2)] for row in range(n)]
    m=[[0 for
col in range(n)] for row in range(len(t))] flag = 0 for j in range(n): if j/t[0]>c[0]: tmp = 9999 else: tmp = j/t[0] if j%t[0]==0: a[j][0] = tmp else: a[j][0] = 9999 m[0][j] = a[j][0] for i in range(len(t)): nnext =
(flag+1)%2 for j in range(1,n): a[j][nnext] = 9999 for k in range(c[i]): if j-k*t[i]<0: break if a[j][nnext] > a[j - k * t[i]][flag]: a[j][nnext] = k + a[j - k * t[i]][flag] m[
i][j] = k flag = nnext if a[s][flag]!=9999: tt = s for i in range(len(t),-1,-1): if tt>=0: print(m[i][tt]+'*'+t[i]) tt -=m[i][tt]*t[i] return a[s][flag] return -1 print(work(18))

2.日期問題

在這裡插入圖片描述
在這裡插入圖片描述
這題浩哥幫忙做的,感謝感謝。

class Date:
    def __init__(self):
        self.y = None	#年
        self.m = None	#月
        self.d = None	#日
    
def isLeap(y):
    return y % 4 == 0 and y % 100 != 0 or y % 400 == 0
    
def daysOfMonth(y,m):
    day = [31,28,31,30,31,30,31,31,30,31,30,31]
    if m != 2:
        return day[m - 1]
    else:
        return 28 + isLeap(y)

def daysOfDate(d):
    days = d.d
    for y in range(1,d.y):	 #只取到上一年
        days += 365 + isLeap(y)
    for m in range(1,d.m):		#取不到當月,因為當月不會取滿,只取到上一個月。
        days += daysOfMonth(d.y, m)
    return days
    
d1,d2 = Date(),Date()
n = int(input())
for i in range(n):
    a,b,c,d,e = [int(kk) for kk in input().split()]
    d1.y = a
    d2.y = a
    d1.m = b
    d1.d = c
    d2.m = d
    d2.d = e
    if d<b or (d == b and e<c):
        d2.y = a + 1
    days1 = daysOfDate(d1)
    days2 = daysOfDate(d2)
    print(days2 - days1)

3.最大整數

有n個正整數,請將它們拼接成一排,組成一個最大的多位整數。例如:n=3時,3個整數13,312,343拼接成的最大整數為:34331213.
輸入:第一行為正整數個數n(n<=10000),第二行n個以空格相隔的正整數(integer型別)
輸出:輸出一行表示答案
樣例輸入:
3
13 312 343
樣例輸出:
34331213
Hint:
樣例中的6種不同的拼接方案中,只有34331213是最大的,因此我們只需要輸出34331213.

參考 https://blog.csdn.net/u010886535/article/details/80962105 (這個只過了40%)
重點在於怎麼排序,一開始以為是把所有排列組合都列出來,後來發現sort裡的cmp規則,可以先想做簡單的,兩個數字的比較,所以比較字元b+a和字元a+b哪個大,然後以此規則,遍歷整個list。

from functools import cmp_to_key
n = int(input())
nums = [k for k in input().split()]	#因為後面用到的字串,所以這裡保留的str格式
#nums = ['312','343', '13']
#nums = ['7','13','4','246']
nums.sort(key=cmp_to_key(lambda a, b: int(b+a) - int(a+b))) #字串a+b>b+a那麼認為a>b,因為從大到小排序,所以用(b+a)-(a+b)
print (int(''.join(nums)))	#拼成一串數字

VMware是在9.30上午8-10點筆試的,很早沒這麼早起了,筆試很懵,做得也不太好,很可惜。幸而實驗室同學浩哥幫忙做了一題,真的很感謝。

之前一直沒留意,筆試只能儲存一種語言,有時候自己用python寫了前兩題,最後一題是同學用java或c++助攻的,結果原來只儲存了java語言,自己做的反而都作廢,也難怪筆試掛了那麼多。雖然大部分筆試都完了,才知道這事,但也坦然了。

過去的事情不要在掛念,徒增煩惱,勇敢的走下去吧。