华为机试在线训练–牛客网(python)第三部分

华为机试在线训练–牛客网(python)

第三部分(21~30)

第二十一题:简单密码破解

题目描述
密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。

假设渊子原来一个BBS上的密码为zvbo9441987,为了方便记忆,他通过一种算法把这个密码变换成YUANzhi1987,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。

他是这么变换的,大家都知道手机上的字母: 1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0,就这么简单,渊子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,

声明:密码中没有空格,而密码中出现的大写字母则变成小写之后往后移一位,如:X,先变成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。

输入描述:
输入包括多个测试数据。输入是一个明文,密码长度不超过100个字符,输入直到文件结尾
输出描述:
输出渊子真正的密文
示例1
输入
YUANzhi1987
输出
zvbo9441987

while True:
    try:
        output=[]
        str = raw_input()
        for i in str:
            if 64 < ord(i) < 90:
                output.append(chr(ord(i)+33))
            elif ord(i) == 90:
                output.append(chr(ord(i)+7))
            elif i in ['a','b','c']:
                output.append('2')
            elif i in ['d','e','f']:
                output.append('3')
            elif i in ['g','h','i']:
                output.append('4')
            elif i in ['j','k','l']:
                output.append('5')
            elif i in ['m','n','o']:
                output.append('6')
            elif i in ['p','q','r','s']:
                output.append('7')
            elif i in ['t','u','v']:
                output.append('8')
            elif i in ['w','x','y','z']:
                output.append('9')
            else:
                output.append(i)
        print ''.join(output)
    except:
        break

第二十二题:汽水瓶

题目描述
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?

输入描述:
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。
输出描述:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。

示例1
输入
3
10
81
0
输出
1
5
40

while True:
    try:
        num = input()
        output = 0
        yushu = 0
        while (num > 2):
            output = (num + yushu) / 3 + output
            yushu1 = (num + yushu) % 3
            num = (num + yushu) / 3
            yushu = yushu1
        if 1 < num + yushu < 4:
            output +=1
        elif num + yushu == 4:
            output +=2
        print output
    except:
        break

第二十三题:删除字符串中出现次数最少的字符

题目描述
实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
输入描述:
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出描述:
删除字符串中出现次数最少的字符后的字符串。
示例1
输入
abcdd
输出
dd

while True:
    try:
        str = raw_input()
        letterList = list(str)
        letterDic = {}
        for i in letterList:
            if i not in letterDic.keys():
                letterDic[i] = 1
            else:
                letterDic[i] += 1
        minCount = min(letterDic.values())
        for i in letterDic:
            if letterDic[i] == minCount:
                letterList.remove(i)#list delete element
        print ''.join(letterList)
    except:
        break

第二十四题:合唱队

题目描述
计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1<=i<=K)使得T1

def lower_bound(nums, target):
    low, high = 0, len(nums)-1
    pos = len(nums)
    while low2
        if nums[mid] < target:
            low = mid+1
        else:
            high = mid
            pos = high
    return pos
def deal(L,res):
    b=[9999]*len(L)
    b[0]=L[0]
    res.append(1)
    for i in range(1,len(L)):
        pos = lower_bound(b,L[i])
        res.append(pos + 1)
        b[pos] = L[i]
    return res
while True:
    try:
        n = input()
        q = [int(i) for i in raw_input().split()]
        dp_1 = []
        dp_2 = []
        dp_1 = deal(q,dp_1)
        q.reverse()
        dp_2 = deal(q,dp_2)
        dp_2.reverse()
        a = max([dp_1[i]+dp_2[i] for i in range(n)])
        print n-a+1
    except:
        break

算法概述
首先计算每个数在最大递增子串中的位置
186 186 150 200 160 130 197 200 quene
1 1 1 2 2 1 3 4 递增计数

然后计算每个数在反向最大递减子串中的位置—>计算反向后每个数在最大递增子串中的位置
200 197 130 160 200 150 186 186 反向quene
1 1 1 2 3 2 3 3 递减计数

然后将每个数的递增计数和递减计数相加
186 186 150 200 160 130 197 200 quene
1 1 1 2 2 1 3 4 递增计数
3 3 2 3 2 1 1 1 递减计数
4 4 3 5 4 2 4 5 每个数在所在队列的人数+1(自己在递增和递减中被重复计算)

如160这个数
在递增队列中有2个人数
150 160
在递减队列中有2个人数
160 130
那么160所在队列中就有3个人
150 160 130

每个数的所在队列人数表达就是这个意思
总人数 - 该数所在队列人数 = 需要出队的人数

第二十五题:数据分类处理

题目描述
信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、 QQ 用户、手机号码、银行帐号等信息及活动记录。
采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出。
输入描述:
一组输入整数序列I和一组规则整数序列R,I和R序列的第一个整数为序列的个数(个数不包含第一个整数);整数范围为0~0xFFFFFFFF,序列个数不限
输出描述:
从R依次中取出Ri,对I进行处理,找到满足条件的 Ij:
Ij整数对应的数字需要连续包含Ri对应的数字。比如Ri为23,Ij为231,那么Ij包含了Ri,条件满足 。
按Ri从小到大的顺序:
(1)先输出Ri;
(2)再输出满足条件的Ij的个数;
(3)然后输出满足条件的Ij在I序列中的位置索引(从0开始);
(4)最后再输出Ij。
附加条件:
(1)Ri需要从小到大排序。相同的Ri只需要输出索引小的以及满足条件的Ij,索引大的需要过滤掉
(2)如果没有满足条件的Ij,对应的Ri不用输出
(3)最后需要在输出序列的第一个整数位置记录后续整数序列的个数(不包含“个数”本身)
序列I:15,123,456,786,453,46,7,5,3,665,453456,745,456,786,453,123(第一个15表明后续有15个整数)
序列R:5,6,3,6,3,0(第一个5表明后续有5个整数)
输出:30, 3,6,0,123,3,453,7,3,9,453456,13,453,14,123,6,7,1,456,2,786,4,46,8,665,9,453456,11,456,12,786
说明:
30—-后续有30个整数
3—-从小到大排序,第一个Ri为0,但没有满足条件的Ij,不输出0,而下一个Ri是3
6— 存在6个包含3的Ij
0— 123所在的原序号为0
123— 123包含3,满足条件
示例1
输入
15 123 456 786 453 46 7 5 3 665 453456 745 456 786 453 123
5 6 3 6 3 0
输出
30 3 6 0 123 3 453 7 3 9 453456 13 453 14 123 6 7 1 456 2 786 4 46 8 665 9 453456 11 456 12 786

while True:
    try:
        I=[int(i) for i in raw_input().strip().split()][1:]
        R=[int(i) for i in raw_input().strip().split()][1:]
        R=list(set(R))
        R.sort()
        l=[]
        A_count=0
        for item in R:
            count=0
            tmp=[]
            for i,jtem in enumerate(I):
                if str(item) not in str(jtem):
                    continue
                else:
                    count+=1
                    tmp.append(i)
                    tmp.append(jtem)
            if tmp:
                l.append(item)
                l.append(count)
                l+=tmp
        l.insert(0,len(l))
        print ' '.join([str(i) for i in l])
    except:
        break

第二十六题:字符串排序

题目描述
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
样例:
输入:
A Famous Saying: Much Ado About Nothing(2012/8).
输出:
A aaAAbc dFgghh : iimM nNn oooos Sttuuuy (2012/8).
输入描述:
输出描述:
示例1
输入
A Famous Saying: Much Ado About Nothing (2012/8).
输出
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).

while True:
    try:
        while True:
            string = raw_input()
            temp = list(string)
            string = filter(lambda x:x.isalpha(),list(string))
            string.sort(key = str.upper)
            j = 0
            for i in range(len(temp)):
                if temp[i].isalpha():
                    temp[i] = string[j]
                    j = j+1
            print ''.join(temp)
    except:
        break

第二十七题:查找兄弟单词

题目描述



输入描述:
先输入字典中单词的个数n,再输入n个单词作为字典单词。
再输入一个单词,查找其在字典中兄弟单词的个数m
再输入数字k
输出描述:
根据输入,输出查找到的兄弟单词的个数m
然后输出查找到的兄弟单词的第k个单词。
示例1
输入
3 abc bca cab abc 1
输出
2 bca

while True:
    try:
        s = raw_input()
        terms = s.split()
        n = int(terms[0])
        word_list = list()
        i = 1
        while i < n + 1:
            word_list.append(terms[i])
            i = i + 1
        query_word = terms[i]
        query_index = int(terms[-1])
        sort_list = list()
        for word in word_list:
            if word == query_word:
                continue
            if len(word) != len(query_word):
                continue
            l = list(word)
            for each in query_word:
                if each in l:
                    l.remove(each)
            if len(l) == 0:
                sort_list.append(word)
        sort_list.sort()
        print len(sort_list)
        if query_index <= len(sort_list):
            print sort_list[query_index - 1]
    except:
        break

第二十八题:素数伴侣

题目描述
题目描述
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。
输入:
有一个正偶数N(N≤100),表示待挑选的自然数的个数。后面给出具体的数字,范围为[2,30000]。
输出:
输出一个整数K,表示你求得的“最佳方案”组成“素数伴侣”的对数。
输入描述:
输入说明
1 输入一个正偶数n
2 输入n个整数
输出描述:
求得的“最佳方案”组成“素数伴侣”的对数。
示例1
输入
4
2 5 6 13
输出
2

import math
def prime_judge(n):
    m = int(math.sqrt(n))
    if n%2 == 0:
        return False
    else:
        for i in range(m+1)[3::2]:
            if n%i == 0:
                return False
    return True
def group_lst(lst):
    odd = []
    even = []
    for i in lst:
        if int(i)%2==1:
            odd.append(int(i))
        else:
            even.append(int(i))
    return (odd,even)
def matrix_ab(a,b):
    matrix = [[0 for i in range(len(b))]for i in range(len(a))]
    for ii,i in enumerate(a):
        for ij,j in enumerate(b):
            if prime_judge(i+j) == True:
                matrix[ii][ij] = 1
    return matrix
def find(x):
    for index,i in enumerate(even):
        if matrix[x][index] == 1 and used[index] == 0:
            used[index] = 1
            if connect[index] == -1 or find(connect[index]) != 0:
                connect[index]=x
                return 1
    return 0
while True:
    try:
        n = input()
        m = raw_input().split()
        (odd,even) = group_lst(m)
        matrix = matrix_ab(odd,even)
        connect = [-1 for i in range(len(even))]
        count = 0
        for i in range(len(odd)):
            used = [0 for j in range(len(even))]
            if find(i):
                count += 1
        print count
    except:
        break

第二十九题:字符串加解密

题目描述
1、对输入的字符串进行加解密,并输出。
2加密方法为:
当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;
当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
其他字符不做变化。
3、解密方法为加密的逆过程。

接口描述:
实现接口,每个接口实现1个基本操作:
void Encrypt (char aucPassword[], char aucResult[]):在该函数中实现字符串加密并输出
说明:
1、字符串以\0结尾。
2、字符串最长100个字符。

int unEncrypt (char result[], char password[]):在该函数中实现字符串解密并输出
说明:
1、字符串以\0结尾。
2、字符串最长100个字符。

输入描述:
输入说明
输入一串要加密的密码
输入一串加过密的密码
输出描述:
输出说明
输出加密后的字符
输出解密后的字符
示例1
输入
abcdefg
BCDEFGH
输出
BCDEFGH
abcdefg

def encoder(s1):
    add_password = ''
    for each in s1:
        if each.isdigit():
            n = int(each)
            if n != 9:
                add_password += str(n + 1)
            else:
                add_password += '0'
        elif each.islower():
            if each != 'z':
                add_password += chr(ord(each) - 31)
            else:
                add_password += 'A'
        elif each.isupper():
            if each != 'Z':
                add_password += chr(ord(each) + 33)
            else:
                add_password += 'a'
        else:
            add_password += each
    return add_password
def decoder(s2):
    decode_password = ''
    for each in s2:
        if each.isdigit():
            n = int(each)
            if n != 0:
                decode_password += str(n - 1)
            else:
                decode_password += str('9')
        elif each.islower():
            if each != 'a':
                decode_password += chr(ord(each) - 33)
            else:
                decode_password += 'Z'
        elif each.isupper():
            if each != 'A':
                decode_password += chr(ord(each) + 31)
            else:
                decode_password += 'z'
        else:
            decode_password += each
    return decode_password
while True:
    try:
        s1 = raw_input()
        s2 = raw_input()
        print encoder(s1)
        print decoder(s2)
    except:
        break

第三十题:字符串合并处理

题目描述
按照指定规则对输入的字符串进行处理。
详细描述:
将输入的两个字符串合并。
对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。
对排序后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符。如字符为‘4’,为0100b,则翻转后为0010b,也就是2。转换后的字符为‘2’; 如字符为‘7’,为0111b,则翻转后为1110b,也就是e。转换后的字符为大写‘E’。

举例:输入str1为”dec”,str2为”fab”,合并为“decfab”,分别对“dca”和“efb”进行排序,排序后为“abcedf”,转换后为“5D37BF”
接口设计及说明:
/*
功能:字符串处理
输入:两个字符串,需要异常处理
输出:合并处理后的字符串,具体要求参考文档
返回:无
*/
void ProcessString(char* str1,char str2,char strOutput)
{
}

输入描述:
输入两个字符串
输出描述:
输出转化后的结果
示例1
输入
dec fab
输出
5D37BF

while True:
    try:
        line = raw_input().split()
        line = line[0]+line[1]
        lineA , lineB, lineRes, lineTrans= '' , '', '', ''
        for i in range(len(line)):
            if i%2 == 0:
                lineA += line[i]#oushu
            else :
                lineB += line[i]#jishu
        lineA, lineB = sorted(lineA), sorted(lineB)
        for i in range(len(lineB)):
            lineRes += lineA[i]
            lineRes += lineB[i]
        if len(lineA) > len(lineB):
            lineRes += lineA[i+1] 

        for i in lineRes:
            if i in '0123456789abcdefABCDEF':
                temp = bin(int('0x'+i,16))[2:]
                temp = (4-len(temp))*'0' + temp
                temp = (hex(int(temp[::-1],2))[2:]).upper()
            else:
                temp = i
            lineTrans += temp
        print lineTrans
    except:
        break

未完待续

你可能感兴趣的:(python基础编程)