【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 的用法

 

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Satisfying

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

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

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

打赏作者

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

抵扣说明:

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

余额充值