华为2019校招笔试题之处理字符串(python版)
华为2019在线笔试题,现整理如下,以供之后参考
GitHub
题目介绍
################################################################# ################################################################# ''' 题目描述: --对输入字符串检查是否存在非法字符,输出合法字符串(去重)和非法字符串(不去重) --对合法字符串循环左移10次,在进行排序输出。(举例:比如字符串"abc",循环左移一次的结果为"bca") 输入描述: (1)字符串中的字符集合为'0'-'9','a'-'z','A'-'Z',其余为非法字符串(空字符串作为定界符), 有非法字符的字符串被视为非法输入; (2)作为输入的字符串个数不超过100,每个字符串长度不超过64; (3)作为输入的连续空字符串(空格/制表符/回车/换行符)作为一个空格处理(作为定界符,字符串起始字符不能为空); (4)输入每行只有一个字符串 (5)输入以空行结束 输出描述: (1)输出合法字符串并去重 (2)输出所有非法字符串 (3)对结果1的去重合法字符串循环左移10次 (4)对结果3合法字符串字符串排序,按ASCII表字符从小到大顺序排序 注意事项: --每输入一个字符后用空格跟下一个字符串隔离,作为输出的所有字符串之间只能有一个空格(作为定界符); 示例1: --输入 abc def == acd123 44234tjg aga'-= ad--s abd 123 abcdef 1234567890123456789012345678901234567890123 45678901234567890123 EDFG SDFG ABC DEF cccc a*b=1 dd 87&&^ asdfas 234abc35 765rgfh4sd 1231 123 == EDFG --输出 abcdefacd12344234tjgabd123abcdef1234 5678901234567890123456789012345678901234567 8901234567890123EDFGSDFGABCDEFccccdd asdfas234abc35765rgfh4sd1231 ==aga'-=as--sa*b=187&&^== bcaefd23acd1234tjg44bda231efabcd1234 5678901234567890123456789012345678901234567 8901231234567890FGEDFGSDBCAEFDccccdd asasdf4abc3523765rgfh4sd3112 1234567890123456789012345678901234567890123 45678901231234567890231234tjg4423acd131 124abc3523765rgfh4sdBCAEFDFGEDFGSDas asdfbcabdaccccddefabcdefd '''
一些技巧
################################################################## ################################################################## ''' NOTE: #注意输入时strip()、split()用法 #extend()函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表) #ord('a')返回字符a的ASCII码 #index=[m.start()forminre.finditer('',x)]返回输入字符串中空格所在索引位置 #字符串去重时,由于需要删除列表新加入的元素,而remove()只能移除列表中第一个匹配的元素,因此需要找到需去重的字符串索引 #用pop(index),从后往前的弹出。由于在此期间存储字符串的列表长度在动态改变,而for循环不能动态改变数组长度,因此用while #split(str="",num=string.count(str))函数 #str_test='This\t\tisa\t\t\ttestforsplit()' #输入:str_test.split()#默认分割(删除)所有的空字符,包括空格、换行(\n)、制表符(\t)等 #输出:['This','is','a','test','for','split()'] #输入:str_test.split('s')#分割所有的字符s #输出:['Thi','\t\ti','a\t\t\tte','tfor','plit()'] #输入:str_test.split('s',2)#分割前2个字符s #输出:['Thi','\t\ti','a\t\t\ttestforsplit()'] '''
具体代码
importsys #初始化输入 definput_init(): string_list=[] whileTrue: line=sys.stdin.readline().rstrip('\n')#逐行读入,并去除行末的换行符 if0==len(line):#输入以空行结束,break语句较强应放在continue语句前,不然会陷入死循环 break iflen(line)>64:#每个字符串长度不超过64 continue iflen(string_list)>100-1:#输入字符串个数不超过100 continue if(line.startswith(''))&(0!=len(line)):#输入字符串不能以空格开始 continue temp_str=line.split()#split(),默认分割(删除)所有的空字符,包括空格、换行(\n)、制表符(\t)等 string_list.append(''.join(temp_str))#输入的连续空字符串(空格/制表符/回车/换行符)作为一个空格处理 returnstring_list #保存合法字符串 defget_legal_string(string_list:list): number_ls=list("0123456789") letter_ls=list("abcdefghijklmnopqrstuvwxyz") up_letter_ls=[] forletterinletter_ls: up_letter_ls.append(letter.upper()) flag=int(0) legal_str=[] forindexinrange(0,len(string_list)): temp_str=string_list[index] forixinrange(0,len(temp_str)): x=temp_str[ix] if(xinnumber_ls)|(xinletter_ls)|(xinup_letter_ls): #合法字符串 flag=1 else: flag=0 break ifflag: legal_str.append(temp_str) returnlegal_str #去除列表中重复的字符串 defremove_repeat_string(string_list:list): remove_repeated_str=string_list.copy() ix=0 whileTrue: temp_str=remove_repeated_str[ix] count=remove_repeated_str.count(temp_str)#统计重复字符串个数 ifix==len(remove_repeated_str)-1: break ifcount==1: ix=ix+1 continue whilecount>1:#for循环不能动态改变数组长度,因此用while count=count-1 j=1 whileTrue: need_remove=remove_repeated_str[-j]#反序遍历 iftemp_str==need_remove: #remove_repeated_str.remove(need_remove)#因为remove()只能移除列表中第一个匹配的元素 pop_index=len(remove_repeated_str)-j remove_repeated_str.pop(pop_index)#删除指定索引位置元素(反序) break else: j=j+1 returnremove_repeated_str #保存非法字符串 defget_non_legal_string(raw_string_list:list,legal_string:list): non_legal_str=[] foriinraw_string_list: ifiinlegal_string: continue non_legal_str.append(i) returnnon_legal_str #左移10次字符10%len(str) defshift_string(string_list:list): shift_string=[] forshift_strinstring_list: start=10%len(shift_str) shift_temp="" shift_temp+=shift_str[start:] shift_temp+=shift_str[:start] shift_string.append(shift_temp) returnshift_string #输出字符串结果 defoutput_string(string_list:list): output="" forstr_instring_list: output+=str_+"" print(output) defmain(): #原始输入 str_list=input_init() #保存合法字符串 legal_str=get_legal_string(str_list) #保存非法字符串 non_legal_str=get_non_legal_string(raw_string_list=str_list,legal_string=legal_str) #保存合法字符串_去重 remove_repeated_string=remove_repeat_string(legal_str) #1.输出去重合法字符串 output_string(remove_repeated_string) #2.输出未去重的非法字符串 output_string(non_legal_str) #3.输出去重合法字符串左移10次后的结果 shift_legal_str=shift_string(remove_repeated_string) output_string(shift_legal_str) #4.输出对合法字符串字符串左移后排序,按ASCII表字符从小到大顺序排序 shift_legal_str=sorted(shift_legal_str) output_string(shift_legal_str) if__name__=='__main__': main()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。