【20190831】【校招筆試題】尋找子串、散步_360(待續)

問題1

思路及解答

# collections 庫的使用 
import sys 
from collections import Counter
def read_data():
 data = sys.stdin.readline().strip()
 c = dict(Counter(data))
 res = list(sorted(c.values(),reverse=True))
 print(res[0])

if __name__=="__main__":
 read_data()


# collections 庫的使用 —— 我寫的
from collections import Counter
s = "aba"
# s = input().strip()
dic = Counter(s)
print(max(dic.values()))


# 我的解法:轉換爲求單個字符的最大次數。
# s = "aba"
s = input().strip()
result = 0
for item in s:
    result = s.count(item) if result < s.count(item) else result
print(result)

問題2

據說題目修改成了求可能的終點個數,我也是交了卷才知道改題目了,下面是我求起點個數的思路和代碼。

思路及解答

# 思路很簡單,因爲是求起點,那麼就很簡單,只要該起點能走出來在[1, N]之間即可,但如果是終點就比較複雜了,下面是可能的起點個數求解。
N, M = map(int, input().split())
List = []
for i in range(M):
    List.append(int(input()))
count = 0
res = []
def backTrack(start, List):
    flag = 0
    f = 0
    for j in range(M):
        if 1 <= start + List[j] <= N:
            start += List[j]
        elif 1 <= start - List[j] <= N:
            start -= List[j]
        else:
            f = 1
            break
    if not f:      # 這兩種寫法還是有區別的!下面那種不對!
        flag = 1
    # if j == M-1:  # 對於 j == M -1 的情況,還會進入循環並且執行 if 語句,然而此時也有可能執行最後 break 的情況,所以這個種情況不能算進去,但這裏加上了,所以以後這種情況最好用一個標誌位判斷是否 break 跳出!
    #     flag = 1
    return flag

for start in range(1, N + 1):   # 遍歷起點[1, N]
    if backTrack(start, List) == 1:
        count += 1
print(count)

修改後的題目及解答:


知識點

1. Counter 庫函數

Counter 是計數函數,我的心得:它的返回值像是 dict 類型的,但又不完全是,但又能用 .keys() 和 .values() 操作,並且用 dict() 可以將它轉換爲完全的 dict 類型!見下圖。

(參考:Python count()方法

(參考:【Python學習】Counter()計數工具

2. 技巧性的想法

對於第一題,求的是子串出現的最大次數,經過分析最大次數一定是單個字符出現的最大次樹,因此轉化爲求解單個字符出現的次數最大值。

3. 三目運算符一定要寫全了!不然會報錯!如下圖。

4.  dic['key'] 和  dic.get(key, default = None)的區別

(1) dic['key']:只能獲取 dic 裏存在的 key 對應的 value;如果不存在,則會觸發 KeyError。

(2) dic.get(key, default = None):如果存在該 key,那麼返回對應的 value,否則返回 default 的值,若沒有設置則返回 None。

(參考:Python基礎—— dict.get() 與 dict['key'] 的區別

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