【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'] 的区别

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Satisfying

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值