【20190902】【校招筆試題】騰訊技術研究類和數據分析第二次筆試(2019.9.1)(待續)

問題1

思路及解答

原本我的思路是:統計每個元素出現的個數,如果存在若干個元素之和等於所有元素個數的一半就是YES,反之是NO。(找的規律,我也不清楚問什麼)

按照這個思路能過好多測試用例,但提交之後通過率爲0%,所以思路是錯的,下面有兩個反例說明這個錯誤。

因此思路應該是:統計所有元素的個數,如果 “所有元素個數 < 所有元素個數之和的一半(或者元素的最大次數 < 所有元素個數之和的一半)”,那麼就是YES,否則爲NO。可以這樣理解:對於任意元素【x】,如果要使能把【x】消掉,那麼【非x 】的個數要大於等於【x】的個數,也就是說【x】的個數不能大於所有元素個數的一半。對於元素【x】,其他的元素都是【非x】,分析問題宏觀來看。

心得:如果通過率爲0%,那麼就想是不是思路錯了,而不是有邊界條件或者沒考慮完全!

# 正確的代碼(統計元素個數可以用哈希表也可以用數組)
T = int(input())
for _ in range(T):
    n = int(input())
    a = list(map(int, input().split()))
    dic = {}
    for item in a:
        if item in dic:
            dic[item] += 1
        else:
            dic[item] = 1
    if max(dic.values()) > len(a)//2:
        print("NO")
    else:
        print("YES")



################# 我的錯誤代碼(思路錯的) ################## 
T = int(input())
# T 組數據
for t in range(T):
    n = int(input())
    a = list(map(int, input().split()))
    # 存取個元素個數
    dic = {}
    for i in range(n):
        if a[i] not in dic:
            dic[a[i]] = 1
        else:
            dic[a[i]] += 1
    l = len(list(set(a)))
    count = list(dic.values())
    count.sort()
    target = sum(count) // 2
    if l == n:
        print("YES")
        continue
    if count[-1] > target:
        print("NO")
        continue
    if target in count:
        print("YES")
        continue
    else:
        for start in range(l):
            flag = 0
            if flag == 0:
                for end in range(start+1, l):
                    if sum(count[start:end+1]) == target:
                        print("YES")
                        flag = 1
                        break
                    elif sum(count[start:end+1]) < target:
                        continue
                    else:
                        break
            else:
                break
        if flag == 0:
            print("NO")
            continue

問題2

思路及解答

# 思路:類似於爬樓梯,以第i個長度爲例,那麼第i-1個長度只能是1個紅花或k個白花t, k = list(map(int, input().split())),如果是1個紅花,說明是從第i-1個位置“爬”過來的,如果是k個紅花,說明是從i-k那個長度“爬”過來的,所以就是dp[i] = dp[i-1] + dp[i-k]。
t, k = list(map(int, input().split()))
N = 100001
tmp = 10**9 + 7
for _ in range(t):
    length = list(map(int, input().split()))
    a, b = length[0], length[1]
    dp = [0] * N
    dp[0], dp[1] = 0, 1   # dp 的初始值
    for i in range(2, b+2):  # 因爲加了一個 i=0, 所以索引要到 b+1
        dp[i] = dp[i-1] + dp[i-k]
    print(sum(dp[a+1:b+2]) % tmp)   # 加了一個 i=0,索引需要是從 a+1 到 b+1

問題3

思路及解答

問題4(還有待優化)

思路及解答

我的思路:

    (1) 如果字符串和輸出字符串包含的元素種類不同,那麼該字符串不可以;

    (2) 如果字符串長度大於輸出字符串長度,那麼該字符串不可以;

    (3) 其餘情況用暴力法判斷:複製字符串 i 次,看是否可以滿足題目條件。

################### 我的代碼60%(超時) ##################
n = int(input())   # 長度限制
T= input()   # 發送的字符串
m = int(input())   # 字符串個數
count = 0
for _ in range(m):
    strs = input()
    l = len(strs)
    if set(strs) != set(T):
        continue
    if l > len(T):
        continue
    else:
        i = 2
        strs0 = strs
        while len(strs) < n:
            strs = strs0 * i
            i += 1
        if strs[0:n] == T:
            count += 1
print(count)



################## 參考的代碼(70%),雖然沒有全A,但我覺得挺好的 ################
n = int(input())   # 長度限制
T= input()   # 發送的字符串
m = int(input())   # 字符串個數
count = 0
for _ in range(m):
    strs = input()
    times = n // len(strs) + 1   # 是求待判斷字符串應該複製幾次纔有可能輸出那個字符串,這裏加一是爲了防止,n//len(strs)有餘數的情況,那麼不加一就會造成待判斷字符串乘以這個次數,依舊長度小於T的長度。
    strs_new = strs_new * times  
    if strs_new[:n] == T:
        count += 1
    else:
        continue
print(count)

問題5

思路及解答

知識點

1. if _name_ == "main":

2. 輸入的兩種方式

3. Python 中 class 類、self 的用法

 

 

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