python--编程练习(字节跳动 2019-3-16)

本篇是笔试时编写保存在pycharm上的代码,标注有子集容易出错的地方,笔试题目共有4道,以下是前2道。
字节跳动的题目,有算法复杂度和内存要求,除此外在编写代码时要考虑输入格式,这是笔试编程与平时编写最大的差别。
**题目1:**找零钱
Z国货币包含面值为1元、4元、16元和64元4种硬币,只有一种面值为1024元的纸币。小Y用一张1024元的纸币买一件N元商品,
问:最后找零最少他会收到多少硬币?
#####################################################
eg:
input:
200 #N的值
output:
17 #找零的最少硬币个数
##12个64元的硬币,3个16元的硬币,2个4元的硬币
代码

import math
N=int(input())  #物品价格
M=1024-N  #找零
x1 = math.floor(M / 64)
x2 = math.floor((M - x1 * 64) / 16)
x3 = math.floor((M - x1 * 64 - x2 * 16) / 4)
x4 = math.floor((M - x1 * 64 - x2 * 16 - x3 * 4) / 1)
print(sum([x1,x2,x3,x4]))

#注意简洁明了,不要把过程复杂化

题目2:校对单词
校对方法:
1.3个相同字母连在一起,一定拼错,去掉其中一个即可
2.AABB型连载一起,一定拼错,去掉BB中的一个,变成AAB
3.以上两种规则,优先从左向右匹配
eg:AABBCC------->AABCC
#################################################
eg:
input:
2 #单词个数
helloo #第一个单词
wooooooow #第二个单词
output:
hello #第一个修整后的单词
woow #第二个修整后的单词

代码:运行正确,但是不知道是否满足内存要求和算法复杂度。

import sys
N=int(input())
words=[]
for i in range(N):
    words.append(list(map(str,sys.stdin.readline( ).strip( ).split( ))))
##定义两个筛选函数
#AAA型
def AAA(s):
    ns=list(s[0])
    I=[]
    for i in range(len(ns)-3):
        if ns[i]==ns[i+1]==ns[i+2]:
            I.append(i+2)
    del ns[I[0]]
    ns = ["".join(ns)]
    return ns

#AABB型
def AABB(s):
    ns = list(s[0])
    I = []
    for i in range(len(ns) - 3):
        if ns[i] == ns[i + 1] and ns[i + 2] == ns[i + 3]:
            I.append(i + 3)
    del ns[I[0]]
    ns=["".join(ns)]
    return ns

#识别AAA型:
def FAAA(s):
    ns=list(s[0])
    I=[]
    for i in range(len(ns)-3):        ## range() 里的-3 容易出错  要预留出最后的位置,不要超出范围
        if ns[i]==ns[i+1]==ns[i+2]:
            I.append(i+2)
    if len(I):
       return  True
    else:
       return  False

#识别AABB型
def FAABB(s):
    ns = list(s[0])
    I = []
    for i in range(len(ns) - 3):
        if ns[i] == ns[i + 1] and ns[i + 2] == ns[i + 3]:
            I.append(i + 3)
    if len(I):
       return  True
    else:
       return  False

###计算程序
for s in words:
    while True:
        if FAAA(s):
            s = AAA(s)
        elif FAABB(s):
            s = AABB(s)
        if not FAAA(s) and not FAABB(s):
            break
    print(" ".join(s))

##做题感悟
1.对于列表按位数分割时 要注意 for循环中 range() 里的-3 容易出错 要预留出最后的位
置,不要超出范围
2.while True /break 的用法
3.列表与字符串的互相转化

你可能感兴趣的:(python--编程练习(字节跳动 2019-3-16))