天天看點

【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點

問題1

【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點
【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點

思路及解答

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

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

【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點

是以思路應該是:統計所有元素的個數,如果 “所有元素個數 < 所有元素個數之和的一半(或者元素的最大次數 < 所有元素個數之和的一半)”,那麼就是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

【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點
【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點

思路及解答

# 思路:類似于爬樓梯,以第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

【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點
【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點

思路及解答

問題4(還有待優化)

【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點
【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點
【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點
【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點

思路及解答

我的思路:

    (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

【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點
【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點
【20190902】【校招筆試題】騰訊技術研究類和資料分析第二次筆試(2019.9.1)(待續)問題1思路及解答問題2思路及解答問題3思路及解答問題4(還有待優化)思路及解答問題5思路及解答知識點

思路及解答

知識點

1. if _name_ == "main":

2. 輸入的兩種方式

3. Python 中 class 類、self 的用法

繼續閱讀