这是我最近看到的面试题,想自己写一下试试,真学渣。我只是把简单功能实现了,希望大家教教我怎么可以把命名以及结构规范化起来。
1. 给定两个字符串a和b(长度超过100w),在字符类型上b是a的子集,求b在a字符类型上的补集;(本题我认为应该可以忽略对于输入的判断)
a='abcdefgcdeh' b='cde' c=[] #以上定义ab的值,定义c序列是为了保存匹配正确的初始位置值,主要是防止a中有多个b的子序列 for i in range(len(a)-len(b)+1):#定义匹配的起始位置 index=i print("***"+str(i)) for j in range(len(b)): if b[j]!=a[index]: break else: index=index+1 if j==len(b)-1: c.append(i) #将匹配成功的位置加入c中 d=[] for k in c: d+=[k+m for m in range(len(b))] #d序列是匹配成功的子集位置 print(d) for i in range(len(a)): if i not in d: #匹配不在序列d内的字符串 print(a[i])
2.给定正整数N, 返回小于等于N且至少有一位重复数字的正整数的个数;
N=int(input('N:')) num=0 if N<11: print(num) else: for i in range(N+1): a={} i=str(i) for j in range(len(i)): if i[j] in a: num+=1 break else: a.update({i[j]:0}) print(num)
3.电话号码组合。下图是一个手机按键的样例,每一个数字包含一些字母。比如字母“A”可以通过按一次“2”得到,字母“B”可以通过按两次“2”得到,以此类推。当给定一个数字字符串,我们也可以得到相应的映射,比如“22”, 代表字母组成的可能性是[“AA”, “B”]。要求:输入为一个数字字符串,例如”2321241499844211”。输出为可能代表的所有字母组合。
import numpy as np ALPHABETS = 'abcdefghijklmnopqrstuvwxyz' KEY_N = np.array([1,1,3,3,3,3,3,4,3,4]) def get_ch(ch, count): if ch < 2: return '' offset = -3 for i in range(ch): offset += KEY_N[i] offset += count return ALPHABETS[offset] def search(pre_res, inputs): len_inputs = len(inputs) # print('len_inputs:', len_inputs) if len_inputs == 0: print(pre_res) return ch = int(inputs[0]) # print('ch:', ch) # print('KEY_N[ch]:', KEY_N[ch]) for i in range(KEY_N[ch]): if i < len_inputs and int(inputs[i]) == ch: # print('1111111') # print(inputs[i+1:]) # print(pre_res + get_ch(ch, i+1)) search(pre_res + get_ch(ch, i+1), inputs[i+1:]) else: # print('2222222') break if __name__ == "__main__": test_case = '12156662227777' search('', test_case)