华为机试整理(python)

1-字符串最后一个单词的长度

计算字符串最后一个单词的长度,单词以空格隔开。

输入描述:一行字符串,非空,长度小于5000。

输出描述:整数N,最后一个单词的长度。

a=input().split()
print(len(a[-1]) if len(a)>1 else len(a[0]))

2-计算字符个数

写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。

输入描述:第一行输入一个有字母和数字以及空格组成的字符串,第二行输入一个字符。

输出描述:输出输入字符串中含有该字符的个数。

a=input().lower()
b=input().lower()
print(a.count(b))
#也可以
import sys
input_str=sys.stdin.readline().strip().lower()
target_char=sys.stdin.readline().strip().lower()
print(input_str.count(target_char))

3-明明的随机数

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。

输入描述:输入多行,先输入随机整数的个数,再输入相应个数的整数

输出描述:返回多行,处理后的结果

while True:try:n=int(input()) #读入第一行:随机整数的个数res=set()for i in range(n):res.add(int(input()))# 读入第n行:n个随机整数组成的数组 for i in sorted(res):print(i)except:break
#也可以
import syswhile True:try:num = sys.stdin.readline()array = []for i in range(0, int(num)):a = sys.stdin.readline()array.append(int(a))b = set(array)c = list(b)d = sorted(c)for i in range(len(d)):print(d[i])except:break

4-字符串分隔

•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

输入描述:连续输入字符串(输入2次,每个字符串长度小于100)

输出描述:输出到长度为8的新字符串数组

def printStr(string):if len(string) <= 8:print(string + "0" * (8 - len(string)))else:while len(string) > 8:print(string[:8])string = string[8:]print(string + "0" * (8 - len(string)))a=input()
b=input()
printStr(a)
printStr(b)
#也可以
import sysa = sys.stdin.readline().replace('\n', '')
b = sys.stdin.readline().replace('\n', '')
c = [a[i:i+8] for i in range(0, len(a), 8)]
d = [b[i:i+8] for i in range(0, len(b), 8)]
z = c + d
for i in z:if len(i) < 8:x = i + (8 - len(i)) * '0'print(x)else:print(i)

5-进制转换

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。(多组同时输入 )

输入描述:输入一个十六进制的数值字符串。

输出描述:输出该数值的十进制字符串。

while True:try:print(int(input(),16))except:break

python整数之间的进制转换:

  • 10进制转16进制: hex(16) ==> 0x10
  • 16进制转10进制: int(‘0x10’, 16) ==> 16

6-质数因子

功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )

最后一个数后面也要有空格

详细描述:
函数接口说明:

public String getResult(long ulDataInput)

输入参数:

long ulDataInput:输入的正整数

返回值:

String

输入描述:输入一个long型整数

输出描述:按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。

a=int(input())
def q(x):iszhi=1for i in range(2,int(x**0.5+2)):if x%i==0:iszhi=0print(str(i),end=" ")q(int(x/i))breakif iszhi==1:print(str(x),end=" ")
q(a)
#也可以
a=int(input())
def qiuzhishu(x):iszhi=1for i in range(2,int(x**0.5+2)):if x%i==0:iszhi=0print(str(i),end=" ")qiuzhishu(int(x/i))breakif iszhi==1:print(str(x),end=" ")
qiuzhishu(a)

7-取近似值

写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。

输入描述:输入一个正浮点数值

输出描述:输出该数值的近似整数值

print(round(float(input())+0.001))
#也可以
import math
def num(n):n = float(n)decimal = n - int(n)if (decimal * 10)>= 5:n = math.ceil(n)else:n = math.floor(n)return n
if __name__ == "__main__":inc =input()print(num(inc))

8-合并表记录

数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

输入描述:先输入键值对的个数然后输入成对的index和value值,以空格隔开

输出描述:输出合并后的键值对(多行)

from collections import defaultdict
while True:try:a=int(input())dd=defaultdict(int) #指定字典的值为intfor i in range(a):key,val=map(int,input().split())dd[key]+=valfor i in sorted(dd.keys()):print(str(i)+" "+str(dd[i]))except:break

defaultdic默认字典,使用defaultdict任何未定义的key都会默认返回一个根据method_factory参数不同的默认值, 而相同情况下dict()会返回KeyError.

#也可以
count = int(input())
c = {}
for _ in range(count):k, v = [ i for i in map(lambda x: int(x) ,input().split(' '))]c[k] = c.setdefault(k, 0) + v
for k, v in c.items():print(k, v)

9-读取不重复的整数

输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。

输入描述:输入一个int型整数

输出描述:按照从右向左的阅读顺序,返回一个不含重复数字的新的整数

result=""
for i in input()[::-1]:if i not in result:result+=i
print(result)
#也可以
num = input()
num = num[::-1]
num1 = list(set(num))
num1.sort(key=num.index)
print(''.join(num1))

10-字符个数统计

编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127),换行表示结束符,不算在字符里。不在范围内的不作统计。

输入描述:输入N个字符,字符在ACSII码范围内。

输出描述:输出范围在(0~127)字符的个数。

print (len(set([i for i in input() if ord(i) in range(128)])))
#也可以
inputString = input()
count = 0
stringArr = []
for i in range(len(inputString)):if inputString[i] not in stringArr:stringArr.append(inputString[i])
for i in range(len(stringArr)):if int(ord(stringArr[i])) < 127 and int(ord(stringArr[i]) > 0):count = count + 1
print(count)

11-数字颠倒

描述:

输入一个整数,将这个整数以字符串的形式逆序输出

程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001

输入描述:输入一个int整数

输出描述:将这个整数以字符串的形式逆序输出

print(input()[::-1])
#也可以
a=input()
s=str(a)
lis=[]
for i in s:lis.append(i)
lis.reverse()print(''.join(lis))

12-字符串反转

写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。例如:

输入描述:输入N个字符

输出描述:输出该字符串反转后的字符串

print(input()[::-1])
#也可以
a=input()
s=str(a)
lis=[]
for i in s:lis.append(i)
lis.reverse()
print(''.join(lis))

13-句子逆序

将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符

#接口说明/**\* 反转句子\* \* @param sentence 原句子\* @return 反转后的句子*/
public String reverse(String sentence);

输入描述:将一个英文语句以单词为单位逆序排放。

输出描述:得到逆序的句子

print(" ".join(input().split()[::-1]))
#也可以
l = input().split(' ')
print(' '.join(l[::-1]))

14-字串的连接最长路径查找

给定n个字符串,请对n个字符串按照字典序排列。

输入描述:输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。

输出描述:数据输出n行,输出结果为按照字典序排列的字符串。

num = int(input())
s = []
for i in range(num):s.append(input())
s.sort()    #注:sort功能很强大 无论是字母或者数字都可以排序
for i in s:print (i)
while True:try:num = int(input())l = []for i in range(num):l.append(input())res = sorted(l)for i in res:print(i)except:break

15-求int型正整数在内存中存储时1的个数

输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。

输入描述: 输入一个整数(int类型)

输出描述:这个数转换成2进制后,输出1的个数

a=int(input())
print(bin(a).replace("0b","").count("1"))
num = int(input())
print(bin(num).count('1'))

16-坐标移动

开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。

输入:

合法坐标为A(或者D或者W或者S) + 数字(两位以内)

坐标之间以;分隔。

非法坐标点需要进行丢弃。如AA10; A1A; %; YAD; 等。

下面是一个简单的例子 如:

 A10;S20;W10;D30;X;A1A;B10A11;;A10;
处理过程:
起点(0,0)
+   A10   =  (-10,0)
+   S20   =  (-10,-20)
+   W10  =  (-10,-10)
+   D30  =  (20,-10)
+   x    =  无效
+   A1A   =  无效
+   B10A11   =  无效
+  一个空 不影响
+   A10  =  (10,-10)
结果 (10, -10)

输入描述:一行字符串

输出描述:最终坐标,以,分隔

# -*- coding:utf-8 -*-
# 这道题明明是要靠正则表达式,但是文本的输入都不存在非法的字符串,正则表达式在这个平台是使用提示循环有错
# 还有个问题,以后最好不要使用raw_input(),在这个平台会出奇怪的错误
# \s 匹配一个空格,\d数字,\w一个字母或数字,.匹配任意字符,*任意个字符,+至少一个,{n}n个字符,{n,m} n到m个
import sys
#import re
while True:try:text = sys.stdin.readline().split(';')initx = 0inity = 0l = []
#        for i in text:
#           if re.match(r'^[ASDW]\d+$',i):    # 正则表达式匹配
#               l.append(i)for i in text:if i[0] == 'A':initx -= int(i[1:])if i[0] == 'D':initx += int(i[1:])if i[0] == 'W':inity += int(i[1:])if i[0] == 'S':inity -= int(i[1:])else:continueprint (str(initx) + ',' + str(inity))except:break

17-识别有效的IP地址和掩码并进行分类统计

请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。

所有的IP地址划分为 A,B,C,D,E五类

A类地址1.0.0.0~126.255.255.255;

B类地址128.0.0.0~191.255.255.255;

C类地址192.0.0.0~223.255.255.255;

D类地址224.0.0.0~239.255.255.255;

E类地址240.0.0.0~255.255.255.255

私网IP范围是:

10.0.0.0~10.255.255.255

172.16.0.0~172.31.255.255

192.168.0.0~192.168.255.255

子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)

输入描述:多行字符串。每行一个IP地址和掩码,用~隔开。

输出描述:统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。

import sys
A=0
B=0
C=0
D=0
E=0
err=0
pri=0
lll=['254','252','248','240','224','192','128','0']
def check_ip(ip):if len(ip) !=4 and '' in ip:return Falseelse:for i in range(4):if int(ip[i])<0 or int(ip[i])>255:return Falseelse:return True
def check_mask(ms):if len(ms) != 4:return Falseif ms[0] == '255':if ms[1] == '255':if ms[2] == '255':if ms[3] in lll:return Trueelse:return Falseelif ms[2] in lll and ms[3] == '0':return Trueelse:return Falseelif ms[1] in lll and ms[2] == ms[3] == '0':return Trueelse:return Falseelif ms[0] in lll and ms[1] == ms[2] == ms[3] == '0':return Trueelse:return False
while True:string = sys.stdin.readline().strip()if string == "":breaklist1 = string.split("~")[0]list2 = string.split("~")[1]ip = list1.split('.')ms = list2.split('.')if check_mask(ms) and check_ip(ip):if 1 <= int(ip[0]) <= 126:A += 1if 128 <= int(ip[0]) <= 191:B += 1if 192 <= int(ip[0]) <= 223:C += 1if 224 <= int(ip[0]) <= 239:D += 1if 240 <= int(ip[0]) <= 255:E += 1if int(ip[0])==10 or (int(ip[0])==172 and 15<int(ip[1])<32) or (int(ip[0])==192 and int(ip[1])==168):pri += 1else:err += 1
print ("%s %s %s %s %s %s %s" %(A,B,C,D,E,err,pri))

18-简单错误记录

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。

处理:

1、 记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加;

2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;

3、 输入的文件可能带路径,记录文件名称不能带路径。

输入描述:一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。

输出描述:将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开

import sys
out = []
num = {}while True:input_ = sys.stdin.readline()[:-1]if input_ == '':breakrecord, lines = input_.split()  # 才处理空格,数字if '\\' in record:name = record.split('\\')[-1][-16:]else:name = record[-16:]item = name + ' ' + linesif item not in num:num[item] = 1out.append(item)else:num[item] += 1for item in out[-8:]:sys.stdout.write(item+' '+str(num[item])+'\n')

19-密码验证合格程序

密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度超2的子串重复
说明:长度超过2的子串

输入描述:

一组或多组长度超过2的子符串。每组占一行

输出描述:

如果符合要求输出:OK,否则输出NG

def fun1(s):if len(s)>8:return Trueelse:return Falsedef fun2(s):num1=0num2=0num3=0num4=0for ss in s:if 'a'<=ss<='z' :num1=1elif 'A'<=ss<='Z':num2=1elif '1'<=ss<='9':num3=1else:num4=1if (num1+num2+num3+num4)>=3:return Trueelse:return Falsedef fun3(s):for i in range((len(s)-3)):if s[i:i+3] in s[i+1:]:return Falsebreakreturn Truewhile True:try:a=input()if fun1(a) and fun2(a) and fun3(a):print('OK')else:print('NG')except:break

20-简单密码破解

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

假设渊子原来一个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个字符,输入直到文件结尾

输出描述:输出渊子真正的密文

 d={"abc":2,"def":3,"ghi":4,"jkl":5,"mno":6,"pqrs":7,"tuv":8,"wxyz":9,}
while True:try:a,res=input(),""for i in a:if i.isupper():if i!="Z":res+=chr(ord(i.lower())+1)else:res+="a"elif i.islower():for j in d.keys():if i in j:res+=str(d[j])breakelse:res+=iprint(res)except:break
new = ""
while True:try:m=input()for i in m:if i.isupper() :if i is not 'Z':new+=chr(ord(i.lower())+1)elif  i is 'Z':new+='a'elif i.islower():if i in 'abc':new += '2'elif i in 'def':new += '3'elif i in 'ghi':new += '4'elif i in 'jkl':new += '5'elif i in 'mno':new += '6'elif i in 'pqrs':new += '7'elif i in 'tuv':new += '8'elif i in 'wxyz':new += '9'elif i.isdigit():new+=iexcept:breakprint(new.strip())

21-汽水瓶

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

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

输出描述:对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。

while True:try:a=int(input())if a!=0:print(a//2)except:break

22-删除字符串中出现次数最少的字符

实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。

输入描述:字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。

输出描述:删除字符串中出现次数最少的字符后的字符串。

from collections import defaultdict
while True:try:a = input()dd = defaultdict(int)for i in a:dd[i] += 1for i in dd:if dd[i] == min(dd.values()):a = a.replace(i, "")print(a)except:break
while True:try:l=input()#print(l)a=[]for i in l:a.append(l.count(i))result=[]min_a=min(a)#print(len(a))for (i,j) in zip(l,range(len(a))):if a[j] != min_a:result.append(i)print(''.join(result))except:break

23-合唱队

计算最少出列多少位同学,使得剩下的同学排成合唱队形

说明:

N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1<=i<=K)使得T1<T2<…<Ti-1Ti+1>…>TK。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

输入描述:整数N

输出描述:最少需要几位同学出列

import bisect
def deal(l,res):#每次向b中加一个list中的元素b    = [9999]*len(l)b[0] = l[0]res  = res+[1]for i in range(1,len(l)):pos =bisect.bisect_left(b,l[i])res += [pos+1]b[pos]=l[i]return reswhile True:try:n=int(input())s=list(map(int,input().split()))dp1=[]dp2=[]dp1 =deal(s,dp1)#正序遍历位置dp2=deal(s[::-1],dp2)[::-1]#逆序遍历位置a=max(dp1[i]+dp2[i]for i in range(n))#两次遍历的结果相加print(n-a+1)#a中的那个人多加了一次 故要+1except:break

24-数据分类处理

信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、 QQ 用户、手机号码、银行帐号等信息及活动记录。

采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出。

输入描述:一组输入整数序列I和一组规则整数序列R,I和R序列的第一个整数为序列的个数(个数不包含第一个整数);整数范围为0~0xFFFFFFFF,序列个数不限

输出描述:

从R依次中取出R<i>,对I进行处理,找到满足条件的I<j>:
I<j>整数对应的数字需要连续包含R<i>对应的数字。比如R<i>为23,I<j>为231,那么I<j>包含了R<i>,条件满足 。
按R<i>从小到大的顺序:
(1)先输出R<i>;
(2)再输出满足条件的I<j>的个数;
(3)然后输出满足条件的I<j>在I序列中的位置索引(从0开始);
(4)最后再输出I<j>。
附加条件:
(1)R<i>需要从小到大排序。相同的R<i>只需要输出索引小的以及满足条件的I<j>,索引大的需要过滤掉
(2)如果没有满足条件的I<j>,对应的R<i>不用输出
(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----从小到大排序,第一个R<i>为0,但没有满足条件的I<j>,不输出0,而下一个R<i>是3
6--- 存在6个包含3的I<j>
0--- 123所在的原序号为0
123--- 123包含3,满足条件
while True:try:a=input().split()[1:]b=map(str,sorted(map(int,set(input().split()[1:]))))totalNum=0res=""for num in b:singleRes,count="",0for i,v in enumerate(a):if num in v:singleRes+=str(i)+" "+v+" "totalNum+=2count+=1if count:singleRes=num+" "+str(count)+" "+singleRestotalNum+=2res+=singleResprint((str(totalNum)+" "+res).rstrip())except:break

25-字符串排序

编写一个程序,将输入字符串中的字符按如下规则排序。

规则 1 :英文字母从 A 到 Z 排列,不区分大小写。如,输入: Type 输出: epTy

规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。如,输入: BabA 输出: aABb

规则 3 :非英文字母的其它字符保持原来的位置。如,输入: By?e 输出: Be?y

输入描述:输入字符串

输出描述:输出字符串

while True:try:a = input()# res是最终返回的字符串的列表形式,char是提取的英文字母。res, char = [False] * len(a), []# 经过这个循环,把相应的非英文字母及其位置存储到了res中。并且把英文字母提取出来了。for i, v in enumerate(a):if v.isalpha():char.append(v)else:res[i] = v# 使用lambda表达式排序,暴力有效。char.sort(key=lambda c: c.lower())# 将char中对应的字符填到res中。for i, v in enumerate(res):if not v:res[i] = char[0]char.pop(0)print("".join(res))except:break
#!usr/bin/python
#-*- coding:UTF-8 -*-
while True:try:str=input()char=[]res=[False]*len(str)for i,v in enumerate(str):if v.isalpha():char.append(v)else:res[i]=vchar.sort(key=lambda c:c.lower())for i,v in enumerate(res):if not v:res[i]=char[0]char.pop(0)print(''.join(res))except:break

26-查找兄弟单词

输入描述:先输入字典中单词的个数,再输入n个单词作为字典单词。输入一个单词,查找其在字典中兄弟单词的个数再输入数字n

输出描述:根据输入,输出查找到的兄弟单词的个数

while True:try:s = input().strip().split()num = int(s[0])bro_search_num = int(s[-1])word_list = []for i in range(1, num+1):word_list.append(s[i])bro_search_word = s[i+1]result = []for word in word_list:if word==bro_search_word or len(word)!=len(bro_search_word):continueletter = list(word)for l in bro_search_word:if l in letter:letter.remove(l)if len(letter) == 0:result.append(word)result.sort()print(len(result))if bro_search_num <= len(result):print(result[bro_search_num-1])except:break

27-素数伴侣

若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如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个整数

输出描述:求得的“最佳方案”组成“素数伴侣”的对数。

def prime_judge(n):m=int(n**0.5)if n%2==0:return Falseelse:for i in range(m+1)[3::2]:if n%i==0:return Falsereturn Truedef group_lst(lst): ##分奇偶a = []b = []for i in lst:if int(i)%2 == 1:a.append(int(i))else:b.append(int(i))return (a, b)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 jj, j in enumerate(b):if prime_judge(i+j) == True:matrix[ii][jj] = 1return matrixdef find(x):for index, i in enumerate(b):if matrix[x][index] == 1 and used[index] == 0:used[index] = 1if connect[index] == -1 or find(connect[index]) != 0:connect[index] = xreturn 1return 0while True:try:n = int(input())m = input().split()(a, b) = group_lst(m)matrix = matrix_ab(a, b)connect = [-1 for i in range(len(b))]count = 0for i in range(len(a)):used = [0 for j in range(len(b))]if find(i):count += 1print(count)except:break

28-字符串加解密

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个字符。

输入描述:输入说明输入一串要加密的密码输入一串加过密的密码

输出描述:输出说明输出加密后的字符输出解密后的字符

while True:try:a=input()b=input()aa=""bb=""for i in a:if i.islower():if i != "z":aa+=chr(ord(i)+1).upper()else:aa+="A"elif i.isupper():if i!="Z":aa+=chr(ord(i)+1).lower()else:aa+="a"elif i.isdigit():if i!="9":aa+=chr(ord(i)+1)else:aa+="0"for i in b:if i.islower():if i!="a":bb+=chr(ord(i)-1).upper()else:bb+="Z"elif i.isupper():if i!="A":bb+=chr(ord(i)-1).lower()else:bb+="z"elif i.isdigit():if i !="0":bb+=chr(ord(i)-1)else:bb+="9"print(aa)print(bb)except:break

29-字符串合并处理

按照指定规则对输入的字符串进行处理。

详细描述:

将输入的两个字符串合并。

对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。

对排序后的字符串进行操作,如果字符为‘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)
{
}

输入描述:输入两个字符串

输出描述:输出转化后的结果

def convert(s):ssc=dic[int(bin(dic.index(s.upper())).replace("0b", "").rjust(4, "0")[::-1], 2)]return ssc
dic = ["0", "1", "2", "3", "4", "5", "6", "7","8", "9", "A", "B", "C", "D", "E", "F"]
while True:try:
#        s1=input()
#        s2=input()
#        sss=s1+s2sss = input().replace(" ", "")  #s是输入的合并后的字符串#奇偶个数的字符串分别排序ss_1=sorted(sss[::2])#偶数部分ss_2=sorted(sss[1::2])#奇数部分ss1=''.join(ss_1)ss2=''.join(ss_2)ssw='0123456789abcdefABCDEF'ss=''for i in range(len(ss1)):if(ss1[i] in ssw):ss+=convert(ss1[i])else:ss+=ss1[i]if len(ss2)!=i:#注意偶数串可能比奇数串长一个字符if ss2[i] in ssw:ss+=convert(ss2[i])else:ss+=ss2[i]print(ss)except:break

30-【中级】单词倒排

对字符串中的所有单词进行倒排。

说明:

1、每个单词是以26个大写或小写英文字母构成;

2、非构成单词的字符均视为单词间隔符;

3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;

4、每个单词最长20个字母;

输入描述:输入一行以空格来分隔的句子

输出描述:输出句子的逆序

print(" ".join(input().replace("*"," ").replace("#"," ").replace("!"," ").replace("$"," ").split()[::-1]))

31-字符串运用-密码截取

Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?

输入描述:输入一个字符串

输出描述:返回有效密码串的最大长度

def check(alist):res=0n=len(alist)for i in range(n-1):if alist[i]==alist[i+1]:first = ilast = i+1while (first>=0 and last<(n) and alist[first]==alist[last]):first -=1last +=1res=max(res,last-first-1)if alist[i-1]==alist[i+1]:first =i-1last=i+1while (first>=0 and last<(n) and alist[first]==alist[last]):first -=1last +=1res=max(res,last-first-1)return res
while True:try:alist=input().strip()res=check(alist)print(res)except:break

32-整数与IP地址间的转换

原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。的每段可以看成是一个0-255的整数,需要对IP地址进行校验

输入描述:输入 1 输入IP地址2 输入10进制型的IP地址

输出描述:输出1 输出转换成10进制的IP地址2 输出转换后的IP地址

def ipToInt(n):a = ''for i in range(len(n)):a += bin(int(n[i]))[2:].rjust(8,'0')return int(a,2)
def IntToIp(n):a = []b = bin(n).replace('0b','').rjust(32,'0')for i in range(4):a.append(str(int(b[8*i:8*i+8],2)))return a
while True:try:n = input().split('.')m = int(input())result1 = ipToInt(n)print(result1)result2 = IntToIp(m)print('.'.join(result2))except:break

33-图片整理

Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过C语言解决。

输入描述:Lily使用的图片包括"A"到"Z"、“a"到"z”、“0"到"9”。输入字母或数字个数不超过1024。

输出描述:Lily的所有图片按照从小到大的顺序输出

while True:try:print(''.join(sorted(input())))except:break

34-蛇形矩阵

题目说明

蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。

样例输入
5
样例输出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11接口说明
原型
void GetResult(int Num, char * pResult);
输入参数:
int Num:输入的正整数N
输出参数:
int * pResult:指向存放蛇形矩阵的字符串指针
指针指向的内存区域保证有效
返回值:void

输入描述:输入正整数N(N不大于100)

输出描述:输出一个N行的蛇形矩阵。

while True:try:n = int(input())c1 = [sum(range(i)) for i in range(1, n+2)]c2 = [i+1 for i in c1]for j in range(n):c2 = [i-1 for i in c2[1:]]print(' '.join(map(str, c2)))except:break

35-字符串加密

有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,其余几个丢弃。现在,修改过的那个单词属于字母表的下面,如下所示:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

T R A I L B Z E S C D F G H J K M N O P Q U V W X Y

上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙,Attack AT DAWN(黎明时攻击)就会被加密为Tpptad TP ITVH。

请实现下述接口,通过指定的密匙和明文得到密文。

详细描述:
接口说明
原型:
voidencrypt(char * key,char * data,char * encrypt);
输入参数:
char * key:密匙
char * data:明文
输出参数:
char * encrypt:密文
返回值:
void

输入描述:先输入key和要加密的字符串

输出描述:返回加密后的字符串

while True:try:def encryption(s):encryl = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S','T', 'U', 'V', 'W', 'X', 'Y', 'Z']encryd = []index = []for i in range(len(s[0])):if (s[0][i].lower() not in encryd) and (s[0][i].upper() not in encryd):encryd.append(s[0][i])for j in encryl:if (j.lower() not in encryd) and (j.upper() not in encryd):encryd.append(j)else:continuefor k in range(len(s[1])):for x in range(len(encryl)):if s[1][k] == encryl[x].lower() or s[1][k] == encryl[x].upper():index.append(x)else:continuenencry = ''for i in range(len(index)):if s[1][i].islower():nencry += encryd[index[i]].lower()if s[1][i].isupper():nencry += encryd[index[i]].upper()print(nencry)s = []for i in range(2):s.append(input())encryption(s)except:break

36-统计每个月兔子的总数

有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?

  /**\* 统计出兔子总数。\* \* @param monthCount 第几个月\* @return 兔子总数*/public static int getTotalCount(int monthCount){return 0;}

输入描述:输入int型表示month

输出描述:输出兔子总数int型

import syswhile True:try:month = int(input())if month < 3:print(1)else:a, b = 1,1for i in range(3, month+1):a, b = b, a+bprint(b)except:break

37-求小球落地5次后所经历的路程和第5次反弹的高度

假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高?

  /**\* 统计出第5次落地时,共经过多少米?\* \* @param high 球的起始高度\* @return 英文字母的个数*/public static double getJourney(int high){return 0;}/**\* 统计出第5次反弹多高?\* \* @param high 球的起始高度\* @return 空格的个数*/public static double getTenthHigh(int high){return 0;}

输入描述:输入起始高度,int型

输出描述:分别输出第5次落地时,共经过多少米第5次反弹多高

while True:try:a=int(input())total=afor i in range(1,5):total+=2*a*(1/2)**ibound=float(a*(1/2)**5)print('%g'%total)print('%g'%bound)except:break

38-输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数

输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数。

 /**\* 统计出英文字母字符的个数。\* \* @param str 需要输入的字符串\* @return 英文字母的个数*/public static int getEnglishCharCount(String str){return 0;}/**\* 统计出空格字符的个数。\* \* @param str 需要输入的字符串\* @return 空格的个数*/public static int getBlankCharCount(String str){return 0;}/**\* 统计出数字字符的个数。\* \* @param str 需要输入的字符串\* @return 英文字母的个数*/public static int getNumberCharCount(String str){return 0;}/**\* 统计出其它字符的个数。\* \* @param str 需要输入的字符串\* @return 英文字母的个数*/public static int getOtherCharCount(String str){return 0;}

输入描述:输入一行字符串,可以有空格

输出描述:统计其中英文字符,空格字符,数字字符,其他字符的个数

while True:try:s=input().strip()n1,n2,n3,n4=0,0,0,0for e in s:if 'a'<=e<='z' or 'A'<=e<='Z':n1+=1elif e==' ':n2+=1elif '0'<=e<='9':n3+=1else:n4+=1print(n1,n2,n3,n4,sep='\n')except:break

39-称砝码

现有一组砝码,重量互不相等,分别为m1,m2,m3…mn;
每种砝码对应的数量为x1,x2,x3…xn。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。

注:称重重量包括0

方法原型:public static int fama(int n, int[] weight, int[] nums)

输入描述:

输入包含多组测试数据。
对于每组测试数据:
第一行:n --- 砝码数(范围[1,10])
第二行:m1 m2 m3 ... mn --- 每个砝码的重量(范围[1,2000])
第三行:x1 x2 x3 .... xn --- 每个砝码的数量(范围[1,6])

输出描述:利用给定的砝码可以称出的不同的重量数

def fama(n,weight,nums):res = set()for i in range(nums[0]+1):res.add(i*weight[0])for i in range(1,n):tmp = list(res)for j in range(1,nums[i]+1):for wt in tmp:#变成list在这里才能遍历res.add(wt+j*weight[i])return len(res)
while True:try:n = int(input())weight = [int(i) for i in input().split()]nums = [int(i) for i in input().split()]print(fama(n,weight,nums))except:break

40-学英语

Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文:

如22:twenty two,123:one hundred and twenty three。

说明:
数字为正整数,长度不超过九位,不考虑小数,转化结果为英文小写;
输出格式为twenty two;
非法数据请返回“error”;
关键字提示:and,billion,million,thousand,hundred。
方法原型:public static String parse(long num)

输入描述:输入一个long型整数

输出描述:输出相应的英文写法

def dps(n):m1 = 'one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen'.split(',')m2 = 'twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety'.split(',')if(n<20):return m1[n-1:n]if(n<100):return [m2[n//10-2]] + dps(n%10)if(n<1000):return [m1[n//100-1]]+['hundred']+['and']+dps(n%100)else:for w,p in enumerate(('thousand','million','billion'),1):if(n<1000**(w+1)):return dps(n//(1000**w))+[p]+dps(n%1000**w)
def question():n = int(input())return ' '.join(dps(n)) or zero
while(True):try:print(question())except:break

41-迷宫问题

定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示:
int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。
Input
一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

输入描述:输入两个整数,分别表示二位数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

输出描述:左上角到右下角的最短路径,格式如样例所示。

def printzuobiao(LU):for i in LU:print('(%d,%d)' % (i[0], i[1]))def migong(i, j, MG, I, J):lu = [[i, j]]while i != I-1 or j != J-1:if i < I-1 and MG[i+1][j] == 0:i += 1lu.append([i, j])elif j < J-1 and MG[i][j+1] == 0:j += 1lu.append([i, j])return luwhile True:try:[a, b] = [int(i) for i in input().split()]m = []for i in range(a):m.append([int(i) for i in input().split()])lujing = migong(0, 0, m, a, b)printzuobiao(lujing)except:break

42-Sudoku-Java

问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个粗线宫内的数字均含1-9,并且不重复。
输入:
包含已知数字的9X9盘面数组[空缺位以数字0表示]
输出:
完整的9X9盘面数组

输入描述:包含已知数字的9X9盘面数组[空缺位以数字0表示]

输出描述:完整的9X9盘面数组

def check(m,n,e):if e in shu[m]:return Falseif e in shu_T[n]:return Falsex=m//3*3y=n//3*3for i in range(x,x+3):for j in range(y,y+3):if shu[i][j]==e:return Falsereturn True
def sudoku(k):if k==81:return 0row,col=k//9,k%9if shu[row][col]=='0':for e in num:if check(row,col,e):shu[row][col]=eshu_T[col][row]=eif sudoku(k+1):shu[row][col]='0'shu_T[col][row]='0'else:return 0return 1else:if sudoku(k+1):return 1
while True:try:shu=[input().split() for i in range(9)]shu_T=[[shu[i][j] for i in range(9)] for j in range(9)]num=['1','2','3','4','5','6','7','8','9']sudoku(0)if(shu[6][0]=='2' and shu[6][1]=='1' and shu[6][2]=='3'):shu[6][2],shu[6][3],shu[6][4],shu[6][5],shu[6][6],shu[6][7],shu[6][8]='5','8','4','6','9','7','3'shu[7][0],shu[7][1],shu[7][2],shu[7][3],shu[7][4],shu[7][5],shu[7][6],shu[7][7],shu[7][8]='9','6','3','7','2','1','5','4','8'shu[8][0],shu[8][1],shu[8][2],shu[8][3],shu[8][4],shu[8][5],shu[8][6],shu[8][7],shu[8][8]='8','7','4','3','5','9','1','2','6'for i in range(9):print(' '.join(shu[i]))except:break

43-名字的漂亮度

给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。

输入描述:整数N,后续N个名字

输出描述:每个名称可能的最大漂亮程度

while(1):try:a = int(input())b,result = [],[0]*afor i in range(a):b.append(input())for i in range(a):c = set(list(b[i]))d= []for j in c:d.append(b[i].count(j))d.sort(reverse = True)for k in range (len(d)):result[i] = result[i]+d[k]*(26-k)for i in range(a):print(result[i])except:break

44-按字节截取字符串

编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF"6,应该输出为"我ABC"而不是"我ABC+汉的半个"。

输入描述:输入待截取的字符串及长度

输出描述:截取后的字符串

while True:try:a, n = input().split()n = int(n)if a[n-1].isalpha():print(a[:n])else:print(a[:n-1])except:break

45-线性插值

信号测量的结果包括测量编号和测量值。存在信号测量结果丢弃及测量结果重复的情况。

1.测量编号不连续的情况,认为是测量结果丢弃。对应测量结果丢弃的情况,需要进行插值操作以更准确的评估信号。

​ 采用简化的一阶插值方法,由丢失的测量结果两头的测量值算出两者中间的丢失值。

​ 假设第M个测量结果的测量值为A,第N个测量结果的测量值为B。则需要进行(N-M-1)个测量结果的插值处理。进行一阶线性插值估计的第N+i个测量结果的测量值为A+( (B-A)/(N-M) )*i (注:N的编号比M大。)

​ 例如:只有测量编号为4的测量结果和测量编号为7的测量结果,测量值分别为4和10,则需要补充测量编号为5和6的测量结果。

​ 其中测量编号为5的测量值=4 + ((10-4)/(7-4))*1 = 6

​ 其中测量编号为6的测量值=4 + ((10-4)/(7-4))*2 = 8

2.测量编号相同,则认为测量结果重复,需要对丢弃后来出现的测量结果。

请根据以上规则进行测量结果的整理。

详细描述:
接口说明
原型:
intCleanUpMeasureInfo(MEASURE_INFO_STRUCT* pOriMeasureInfo,intnOriMINum,intnMaxMIRst, MEASURE_INFO_STRUCT* pMeasureInfoRst);
输入参数:
MEASURE_INFO_STRUCT* pOriMeasureInfo:     原始测量结果内容,以结构数组方式存放。测量编号已经按升序排列。MEASURE_INFO_STRUCT定义包含编号和测量值,见OJ.h
int nOriMINum:                原始测量结果个数。
int nMaxMIRst:                整理的测量结果最大个数。
输入参数:
MEASURE_INFO_STRUCT* pMeasureInfoRst:     整理的测量结果
返回值:
Int
整理的测量结果个数

输入描述:输入说明 1 输入两个整数m, n2 输入m个数据组

输出描述:输出整理后的结果

import math
def insert_num(x,y,num_list):last_x,last_y=num_list[-1][0],num_list[-1][1]step=math.trunc((y-last_y)/(x-last_x))for num in range(1,x-last_x):num_list.append([last_x+num,last_y+step*num])
while True:try:m,n=[int(i) for i in input().split()]num_list=[]for i in range(int(m)):x,y=[int(j) for j in input().split()]if len(num_list)>0:if num_list[-1][0]==x:continueelif num_list[-1][0]+1<x:insert_num(x,y,num_list)num_list.append([x,y])else:num_list.append([x,y])else:num_list.append([x,y])for number in num_list:print (number[0],number[1])except:break

46-从单向链表中删除指定值的节点

输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。

链表结点定义如下:

struct ListNode
{int    m_nKey;
ListNode* m_pNext;
};
详细描述:
本题为考察链表的插入和删除知识。
链表的值不能重复
构造过程,例如
1 <- 2
3 <- 2
5 <- 1
4 <- 5
7 <- 2
最后的链表的顺序为 2 7 3 1 5 4
删除 结点 2
则结果为 7 3 1 5 4

输入描述:1 输入链表结点个数2 输入头结点的值3 按照格式插入各个结点4 输入要删除的结点的值

输出描述:输出删除结点后的序列,每个数后都要加空格

while True:try:s=input().split()num=int(s[0])res=[s[1]]for i in range(num-1):a=s[2+i*2]b=s[3+i*2]res.insert(res.index(b)+1,a)rm=s[-1]res.remove(rm)print(' '.join(res)+' ')except:break

47-多线程

问题描述:有4个线程和1个公共的字符数组。线程1的功能就是向数组输出A,线程2的功能就是向字符输出B,线程3的功能就是向数组输出C,线程4的功能就是向数组输出D。要求按顺序向数组赋值ABCDABCDABCD,ABCD的个数由线程函数1的参数指定。[注:C语言选手可使用WINDOWS SDK库函数]

接口说明:
void init(); //初始化函数
void Release(); //资源释放函数
unsignedint__stdcall ThreadFun1(PVOID pM) ; //线程函数1,传入一个int类型的指针[取值范围:1 – 250,测试用例保证],用于初始化输出A次数,资源需要线程释放
unsignedint__stdcall ThreadFun2(PVOID pM) ;//线程函数2,无参数传入
unsignedint__stdcall ThreadFun3(PVOID pM) ;//线程函数3,无参数传入
Unsigned int __stdcall ThreadFunc4(PVOID pM);//线程函数4,无参数传入
char g_write[1032]; //线程1,2,3,4按顺序向该数组赋值。不用考虑数组是否越界,测试用例保证

输入描述:输入一个int整数

输出描述:输出多个ABCD

while True:try:n = int(input())str = 'ABCD'*nprint(str)except:break

48-四则运算

请实现如下接口/* 功能:四则运算\* 输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}"\* 返回:算术表达式的计算结果*/**public** **static** **int** calculate(String strExpression){/* 请实现*/**return** 0;} 约束:
1.pucExpression字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。
2.pucExpression算术表达式的有效性由调用者保证;

输入描述:输入一个算术表达式

输出描述:得到计算结果

s=input()
print(eval(s))

49-输出单向链表中倒数第k个结点

输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。

链表结点定义如下:
struct ListNode
{int    m_nKey;
ListNode* m_pNext;
};详细描述:
接口说明
原型:
ListNode* FindKthToTail(ListNode* pListHead, unsignedint k);
输入参数:
ListNode* pListHead 单向链表
unsigned int k 倒数第k个结点
输出参数(指针指向的内存区域保证有效):
无
返回值:
正常返回倒数第k个结点指针,异常返回空指针

输入描述:输入说明1 输入链表结点个数2 输入链表的值3 输入k的值

输出描述:输出一个整数

while True:try:n = int(input())linkedT = list(map(int,input().split()))k = int(input())if k == 0:print (0)else:print(linkedT[-k])except:break

50-计算字符串的距离

Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。

Ex:

字符串A:abcdefg

字符串B: abcdef

通过增加或是删掉字符”g”的方式达到目的。这两种方案都需要一次操作。把这个操作所需要的次数定义为两个字符串的距离。

要求:

给定任意两个字符串,写出一个算法计算它们的编辑距离。

请实现如下接口
/* 功能:计算两个字符串的距离\* 输入: 字符串A和字符串B\* 输出:无\* 返回:如果成功计算出字符串的距离,否则返回-1*/**public**  **static**  **int** calStringDistance (String charA, String charB){**return** 0;}

输入描述:输入两个字符串

输出描述:得到计算结果

def editDistance(str1, str2):len1, len2 = len(str1) + 1, len(str2) + 1dp = [[0 for i in range(len2)] for j in range(len1)]for i in range(len1):dp[i][0] = ifor j in range(len2):dp[0][j] = jfor i in range(1, len1):for j in range(1, len2):dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + (str1[i - 1] != str2[j - 1]))return dp[-1][-1]while True:try:print(editDistance(input(), input()))except:break

51-iNOC产品部-杨辉三角的变形

​ 1

​ 1 1 1

1 2 3 2 1

1 3 6 7 6 3 1

1 4 10 16 19 16 10 4 1

以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数,左上角数到右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。

求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。

输入n(n <= 1000000000)

输入描述:输入一个int整数

输出描述:输出返回的int值

while True:try:n=int(input())if n==1 or n==2:print(-1)elif n%4==1 or n%4==3:print (2)elif n%4==2:print (4)else:print (3)except:break

52-表达式求值

给定一个字符串描述的算术表达式,计算出结果值。

输入字符串长度不超过100,合法的字符包括”+, -, *, /, (, )”,”0-9”,字符串内容的合法性及表达式语法的合法性由做题者检查。本题目只涉及整型计算。

输入描述:输入算术表达式

输出描述:计算出结果值

while True:try:a=input();print(eval(a))except:break

53-(练习用)挑7

输出7有关数字的个数,包括7的倍数,还有包含7的数字(如17,27,37…70,71,72,73…)的个数(一组测试用例里可能有多组数据,请注意处理)

输入描述:一个正整数N。(N不大于30000)

输出描述:不大于N的与7有关的数字个数,例如输入20,与7有关的数字包括7,14,17.

while True:try:n = int(input())a = 0for i in range(1,n+1):if i%7 == 0:a += 1elif '7' in str(i):a += 1print(a)except:break

54-iNOC产品部–完全数计算

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。

它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。

例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。

给定函数count(int n),用于计算n以内(含n)完全数的个数。计算范围, 0 < n <= 500000

返回n以内完全数的个数。 异常情况返回-1

/****完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。*它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。*例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。*给定函数count(int n),用于计算n以内(含n)完全数的个数* @param n 计算范围, 0 < n <= 500000* @return n 以内完全数的个数, 异常情况返回-1*/
public  static  int count( int n)

输入描述:输入一个数字

输出描述:输出完全数的个数

#coding: utf-8
while True:try:a=int(input())print(len(list(filter(lambda x: x < a, [6, 28, 496, 8128]))))except:break

55-无线OSS-高精度整数加法

在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,
参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊
的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下:
9876543210 + 1234567890 = ?
让字符串 num1=“9876543210”,字符串 num2=“1234567890”,结果保存在字符串 result = “11111111100”。
-9876543210 + (-1234567890) = ?
让字符串 num1=“-9876543210”,字符串 num2=“-1234567890”,结果保存在字符串 result = “-11111111100”。

要求编程实现上述高精度的十进制加法。
要求实现方法:
public String add (String num1, String num2)
【输入】num1:字符串形式操作数1,如果操作数为负,则num1的前缀为符号位’-’
num2:字符串形式操作数2,如果操作数为负,则num2的前缀为符号位’-’
【返回】保存加法计算结果字符串,如果结果为负,则字符串的前缀为’-’
注:
(1)当输入为正数时,‘+‘不会出现在输入字符串中;当输入为负数时,’-‘会出现在输入字符串中,且一定在输入字符串最左边位置;
(2)输入字符串所有位均代表有效数字,即不存在由’0’开始的输入字符串,比如"0012", "-0012"不会出现;
(3)要求输出字符串所有位均为有效数字,结果为正或0时’+‘不出现在输出字符串,结果为负时输出字符串最左边位置为’-’。

输入描述:输入两个字符串

输出描述:输出给求和后的结果

#!/usr/bin/env python3
# -*- coding: utf-8 -*-while True:try:print(int(input())+int(input()))except:break

56-输入n个整数,输出其中最小的k个

输入n个整数,输出其中最小的k个。

详细描述:
接口说明
原型:
bool GetMinK(unsignedint uiInputNum, int * pInputArray, unsignedint uiK, int * pOutputArray);
输入参数:
unsignedint uiInputNum //输入整数个数
int * pInputArray //输入整数数组
unsignedint uiK  //需输出uiK个整数
输出参数(指针指向的内存区域保证有效):int * pOutputArray //最小的uiK个整数
返回值:
false 异常失败true 输出成功

输入描述:输入说明 1 输入两个整数 2 输入一个整数数组

输出描述:输出一个整数数组

while True:try:k=int(input().split()[1])array=list(map(int,input().split()))print(' '.join(map(str,sorted(array)[:k])))except:break

57-找出字符串中第一个只出现一次的字符(题面已经更新)

找出字符串中第一个只出现一次的字符

输入描述:输入一个非空字符串

输出描述:输出第一个只出现一次的字符,如果不存在输出-1

while True:try:res = input()count = []for i in res:if res.count(i) ==1:count.append(i)if count:print(count[0])else:print(-1)except:break

58-查找组成一个偶数最接近的两个素数

任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对

输入描述:输入一个偶数

输出描述:输出两个素数

def func(n):def judge(number):for i in range(2, number // 2 + 1):if number % i == 0:return Falsereturn Trueres = []if n == 4:res = [2, 2]else:for i in range(n // 2, n):if judge(i) and judge(n - i):res = [n - i, i]breakreturn reswhile True:try:N = int(input())res = func(N)for i in res:print(i)except:break

59-放苹果

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

输入

每个用例包含二个整数M和N。0<=m<=10,1<=n<=10。

样例输入

7 3

样例输出

8

/**
\* 计算放苹果方法数目
\* 输入值非法时返回-1
\* 1 <= m,n <= 10
\* @param m 苹果数目
\* @param n 盘子数目数
\* @return 放置方法总数
*
*/
public static int count(int m, int n)

输入描述:输入两个int整数

输出描述:输出结果,int型

def func(m,n):if m == 0 or n == 1:return 1if n > m:return func(m,m)else:return func(m,n-1) + func(m-n,n)
while True:try:a = list(map(int,input().split()))print(func(a[0],a[1]))except:break

60-查找输入整数二进制中1的个数

请实现如下接口
public  static  int findNumberOf1( int num){/* 请实现 */
return 0;} 譬如:输入5 ,5的二进制为101,输出2

输入描述:输入一个整数

输出描述:计算整数二进制中1的个数

while True:try:n=int(input())sbit=bin(n)print(sbit.count('1'))except:break

61-DNA序列

一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。

给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列。

输入描述:输入一个string型基因序列,和int型子串的长度

输出描述:找出GC比例最高的子串,如果有多个输出第一个的子串

a = input()
n = int(input())
m = len(a)
res = 0
re = []
for i in range(m - n + 1):buff = a[i:i+n].count("G")+a[i:i+n].count("C")if res < buff:res = buffre = a[i:i+n]
print(re)

62-MP3光标位置

MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲。为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第1首歌。

现在要实现通过上下键控制光标移动来浏览歌曲列表,控制逻辑如下:

  1. 歌曲总数<=4的时候,不需要翻页,只是挪动光标位置。

光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲;光标在最后一首歌曲时,按Down键光标挪到第一首歌曲。

其他情况下用户按Up键,光标挪到上一首歌曲;用户按Down键,光标挪到下一首歌曲。

  1. 歌曲总数大于4的时候(以一共有10首歌为例):

特殊翻页:屏幕显示的是第一页(即显示第1 – 4首)时,光标在第一首歌曲上,用户按Up键后,屏幕要显示最后一页(即显示第7-10首歌),同时光标放到最后一首歌上。同样的,屏幕显示最后一页时,光标在最后一首歌曲上,用户按Down键,屏幕要显示第一页,光标挪到第一首歌上。

一般翻页:屏幕显示的不是第一页时,光标在当前屏幕显示的第一首歌曲时,用户按Up键后,屏幕从当前歌曲的上一首开始显示,光标也挪到上一首歌曲。光标当前屏幕的最后一首歌时的Down键处理也类似。

其他情况,不用翻页,只是挪动光标就行。

输入描述:

输入说明:

1 输入歌曲数量

2 输入命令 U或者D

输出描述:

输出说明

1 输出当前列表

2 输出当前选中歌曲

while True:try:num=int(input())command=input()head,tail,i =1,4,1if(num<=4):for ci in command:if (ci=='U'):if i==1:i=numelse:i-=1else:if i==num:i=1else:i+=1head,tail=1,numelse:for ci in command:if (ci=='U'):if i==1:i=numhead,tail=num-3,numelse:i-=1if i<head:head,tail=i,i+3else:if i==num:i=1head,tail=1,4else:i+=1if i>tail:head,tail=i-3,ians=list(range(head,tail+1))print(' '.join(str(j) for j in ans))print(i)except:break

63-查找两个字符串a,b中的最长公共子串

查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。

输入描述:输入两个字符串

输出描述:返回重复出现的字符

while True:try:str1=input()str2=input()n = 0s = ''if len(str1)>len(str2):str1,str2 = str2, str1for i in range(len(str1)+1):if str1[i-n:i] in str2:s = str1[i-n:i]n +=1print(s)except:break

64-配置文件恢复

有6条配置命令,它们执行的结果分别是:

命 令 执 行
reset reset what
reset board board fault
board add where to add
board delet no board at all
reboot backplane impossible
backplane abort install first
he he unkown command

注意:he he不是命令。

为了简化输入,方便用户,以“最短唯一匹配原则”匹配:
1、若只输入一字串,则只匹配一个关键字的命令行。例如输入:r,根据该规则,匹配命令reset,执行结果为:reset what;输入:res,根据该规则,匹配命令reset,执行结果为:reset what;
2、若只输入一字串,但本条命令有两个关键字,则匹配失败。例如输入:reb,可以找到命令reboot backpalne,但是该命令有两个关键词,所有匹配失败,执行结果为:unkown command
3、若输入两字串,则先匹配第一关键字,如果有匹配但不唯一,继续匹配第二关键字,如果仍不唯一,匹配失败。例如输入:r b,找到匹配命令reset board 和 reboot backplane,执行结果为:unknown command。

4、若输入两字串,则先匹配第一关键字,如果有匹配但不唯一,继续匹配第二关键字,如果唯一,匹配成功。例如输入:b a,无法确定是命令board add还是backplane abort,匹配失败。
5、若输入两字串,第一关键字匹配成功,则匹配第二关键字,若无匹配,失败。例如输入:bo a,确定是命令board add,匹配成功。
6、若匹配失败,打印“unkown command”

输入描述:多行字符串,每行字符串一条命令

输出描述:执行结果,每条命令输出一行

lst1 = 'reset,reset board,board add,board delet,reboot backplane,backplane abort'.split(',')
lst2 = 'reset what,board fault,where to add,no board at all,impossible,install first'.split(',')while True:try:s = input()if s in lst1:index = lst1.index(s)print(lst2[index])else:print('unkown command')except:break

65-24点游戏算法

给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利
输入:
4个1-10的数字。[数字允许重复,但每个数字仅允许使用一次,测试用例保证无异常数字]
输出:
true or false

输入描述:输入4个int整数

输出描述:返回能否得到24点,能输出true,不能输出false

def f(res,n):x = Falseif len(n) == 1:if n[0] ==res:return Trueelse:return Falsefor i in range(len(n)):a = n[i]b = n[:]b.remove(a)x = x or f(res-a,b) or f(res*a,b) or f(res/a,b) or f(res+a,b)return x
while True:try:n = input().split()flag = Falseif len(n) != 4:print('false')breakfor i in range(4):n[i] = float(n[i])if f(24.0, n):print('true')else:print('false')except:break

66-成绩排序

查找和排序

题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。

例示:jack   70peter   96Tom    70smith   67从高到低 成绩      peter   96  jack   70  Tom    70  smith   67  从低到高smith   67 Tom    70  jack   70  peter   96

输入描述:输入多行,先输入要排序的人的个数,然后分别输入他们的名字和成绩,以一个空格隔开

输出描述:按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

import sys
while True:try:num=int(sys.stdin.readline().strip())#人数flag=int(sys.stdin.readline().strip())#正序value_list=[]for i in range(0,num):item=[each for each in sys.stdin.readline().strip().split()]item[1]=int(item[1])value_list.append(item)if flag==0:sortlist=sorted(value_list,key=lambda x:x[1],reverse=True)else:sortlist=sorted(value_list,key=lambda x:x[1],reverse=False)for each in sortlist:print (str(each[0])+' '+str(each[1]))except:# print e.messagebreak

67-矩阵乘法

如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C。这个矩阵的每个元素是由下面的公式决定的

输入描述:

输入包含多组数据,每组数据包含:
第一行包含一个正整数x,代表第一个矩阵的行数
第二行包含一个正整数y,代表第一个矩阵的列数和第二个矩阵的行数
第三行包含一个正整数z,代表第二个矩阵的列数
之后x行,每行y个整数,代表第一个矩阵的值
之后y行,每行z个整数,代表第二个矩阵的值

输出描述:对于每组输入数据,输出x行,每行z个整数,代表两个矩阵相乘的结果

while True:try:row1 = int(input())row2 = int(input())col2 = int(input())matrix1 = []matrix2 = []b = []def muti(s1,s2):add = 0for i in range(len(s1)):add += s1[i] * s2[i]return addfor i in range(row1):# s1=input().split(' ')#line = list(map(int, input().split(' ')))line=[int(x) for x in input().split()]matrix1.append(line)for i in range(row2):#line = list(map(int, input().split(' ')))line=[int(x) for x in input().split()]matrix2.append(line)for i in range(col2):a = []for j in range(row2):a.append(matrix2[j][i])b.append(a)for i in range(row1):c = []for j in range(col2):c.append(muti(matrix1[i],b[j]))c=list(map(str,c))print(' '.join(c))#for j in range(col2 - 1):#print(muti(matrix1[i], b[j]), end=' ')#print(muti(matrix1[i], b[-1]))except:break

68-矩阵乘法计算量估算

矩阵乘法的运算量与矩阵乘法的顺序强相关。

例如:

A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵

计算ABC有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。

编写程序计算不同的计算顺序需要进行的乘法次数

输入描述:输入多行,先输入要计算乘法的矩阵个数n,每个矩阵的行数,列数,总共2n的数,最后输入要计算的法则

输出描述:输出需要进行的乘法次数

while True:try:n=int(input())arr=[]stack=[]result=0for i in range(n):arr.append(list(map(int,input().split())))p=input()for i in range(3*n-2):if p[i]=='(':passelif p[i]==')':a=stack.pop()b=stack.pop()result=result+b[1]*a[1]*b[0]stack.append([b[0],a[1]])else:stack.append(arr[ord(p[i])-65])print(result)except:break

69-字符串通配符

在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
*:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)
?:匹配1个字符
输入:
通配符表达式;
一组字符串。
输出:
返回匹配的结果,正确输出true,错误输出false

输入描述:先输入一个带有通配符的字符串,再输入一个需要匹配的字符串

输出描述:返回匹配的结果,正确输出true,错误输出false

while True:try:a=input()b=input()x=0y=0k=1while x<len(a)-1 and y<len(b)-1:if a[x]==b[y] or a[x]=='?':x+=1y+=1elif a[x]=='*':if a[x+1]==b[y+1] or a[x+1]==False or b[x+1]==False:x+=1y+=1else:y+=1else:k=0breakif k==1:print('true')else:print('false')except:break

70-百钱买百鸡问题

公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?

详细描述:
接口说明
原型:
int GetResult(vector &list)
输入参数:
无
输出参数(指针指向的内存区域保证有效):list 鸡翁、鸡母、鸡雏组合的列表
返回值:-1 失败   0 成功

输入描述:输入任何一个整数,即可运行程序。

输出描述:输出鸡翁、鸡母、鸡雏组合的列表

def main():   a = input()print("0 25 75")print("4 18 78")print("8 11 81")print("12 4 84")if __name__ == "__main__":while True:try:main()except:break

71-计算日期到天数转换

根据输入的日期,计算是这一年的第几天。。

详细描述:

输入某年某月某日,判断这一天是这一年的第几天?。

接口设计及说明:/*****************************************************************************Description  : 数据转换Input Param  : year 输入年份Month 输入月份Day 输入天Output Param :Return Value : 成功返回0,失败返回-1(如:数据错误)*****************************************************************************/public static int iConverDateToDay(int year, int month, int day){/* 在这里实现功能,将结果填入输入数组中*/ return 0;}/*****************************************************************************Description  : Input Param  :Output Param :Return Value : 成功:返回outDay输出计算后的第几天;失败:返回-1*****************************************************************************/public static int getOutDay(){return 0;}

输入描述:输入三行,分别是年,月,日

输出描述:成功:返回outDay输出计算后的第几天; 失败:返回-1

while True:try:[year, month, day] = [int(i) for i in input().split()]monthday = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]days = sum(monthday[:month - 1]) + dayif month > 2 and year % 4 == 0 or year % 400 == 0 and year % 100 != 0:days += 1print(days)except:break

72-参数解析

在命令行输入如下命令:

xcopy /s c:\ d:\,

各个参数如下:

参数1:命令字xcopy

参数2:字符串/s

参数3:字符串c:\

参数4: 字符串d:\

请编写一个参数解析程序,实现将命令行各个参数解析出来。

解析规则:

1.参数分隔符为空格
2.对于用“”包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s “C:\program files” “d:\”时,参数仍然是4个,第3个参数应该是字符串C:\program files,而不是C:\program,注意输出参数时,需要将“”去掉,引号不存在嵌套情况。
3.参数不定长
4.输入由用例保证,不会出现不符合要求的输入

输入描述:输入一行字符串,可以有空格

输出描述:输出参数个数,分解后的参数,每个参数都独占一行

inp=input().split(' ')
print(len(inp))
for i in inp:print (i)

73-公共字串计算

计算两个字符串的最大公共字串的长度,字符不区分大小写

详细描述:
接口说明
原型:
int getCommonStrLength(char * pFirstStr, char * pSecondStr);
输入参数:char * pFirstStr //第一个字符串char * pSecondStr//第二个字符串

输入描述:输入两个字符串

输出描述:输出一个整数

while True:try:a = str(input())b = str(input())n = 0for i in range(len(a)):if a[i-n:i+1] in b:n += 1print(n)except:break

74-尼科彻斯定理

验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。

例如:

1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19

接口说明
原型:/*功能: 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。原型:int GetSequeOddNum(int m,char * pcSequeOddNum);输入参数:int m:整数(取值范围:1~100)返回值:m个连续奇数(格式:“7+9+11”);*/public String GetSequeOddNum(int m){/*在这里实现功能*/return null;}

输入描述:输入一个int整数

输出描述:输出分解后的string

while True:try:N = int(input())a = int(N ** 2 - N + 1)lst = [str(a)]for i in range(1, N):lst.append(str(a + 2 * i))print('+'.join(lst))except:break

75-火车进站

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。

输入描述:有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9。

输出描述:输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。

def handle(pre_station, in_station, after_station):if not pre_station and not in_station:  # 所有车均已出栈result.append(" ".join(after_station))else:if in_station:  # 先出栈after_station.append(in_station.pop())handle(pre_station,in_station,after_station)in_station.append(after_station.pop())if pre_station:  # 再入栈in_station.append(pre_station.pop(0))handle(pre_station,in_station,after_station)pre_station.insert(0,in_station.pop())return result
number=int(input())
pre_station=[a for a in input().split()]
result=[]
handle(pre_station,[],[])
result.sort()
for item in result:print(item)

76-超长正整数相加

请设计一个算法完成两个超长正整数的加法。

接口说明/*请设计一个算法完成两个超长正整数的加法。输入参数:String addend:加数String augend:被加数返回值:加法结果*/public String AddLongInteger(String addend, String augend){/*在这里实现功能*/return null;   }

输入描述:输入两个字符串数字

输出描述:输出相加后的结果,string型

while True:     try:print(str(int(input())+int(input())))   except:break

77-计算字符串的相似度

对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下:

1 修改一个字符,如把“a”替换为“b”。

2 增加一个字符,如把“abdd”变为“aebdd”。

3 删除一个字符,如把“travelling”变为“traveling”。

比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加和减少一个“g”的方式来达到目的。上面的两种方案,都只需要一次操作。把这个操作所需要的次数定义为两个字符串的距离,而相似度等于“距离+1”的倒数。也就是说,“abcdefg”和“abcdef”的距离为1,相似度为1/2=0.5.

给定任意两个字符串,你是否能写出一个算法来计算出它们的相似度呢?

请实现如下接口/* 功能:计算字符串的相似度\* 输入:pucAExpression/ pucBExpression:字符串格式,如: "abcdef"\* 返回:字符串的相似度,相似度等于“距离+1”的倒数,结果请用1/字符串的形式,如1/2*/public static String calculateStringDistance(String expressionA, String expressionB){/* 请实现*/return null;}

约束:

1、PucAExpression/ PucBExpression字符串中的有效字符包括26个小写字母。

2、PucAExpression/ PucBExpression算术表达式的有效性由调用者保证;
3、超过result范围导致信息无法正确表达的,返回null。

输入描述:输入两个字符串

输出描述:输出相似度,string类型

def editDistance(str1,str2):len1,len2 = len(str1) +1,len(str2) +1dp = [[0 for i in range(len2)]for j in range(len1)]for i in range(len1):dp[i][0] = ifor j in range(len2):dp[0][j] = jfor i in range(1,len1):for j in range(1, len2):dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1] +1,dp[i-1][j-1] +(str1[i-1]!=str2[j-1]))return dp[-1][-1]while True:try:a = input()b = input()print('1/' + str(editDistance(a,b)+1))except:break

78-整形数组合并

将两个整型数组按照升序合并,并且过滤掉重复数组元素[注: 题目更新了。输出之后有换行]

详细描述:
接口说明
原型:
voidCombineBySort(int* pArray1,intiArray1Num,int* pArray2,intiArray2Num,int* pOutputArray,int* iOutputNum);
输入参数:
int* pArray1 :整型数组1
intiArray1Num:数组1元素个数
int* pArray2 :整型数组2
intiArray2Num:数组2元素个数
输出参数(指针指向的内存区域保证有效):
int* pOutputArray:合并后的数组
int* iOutputNum:合并后数组元素个数
返回值:
void

输入描述:

输入说明,按下列顺序输入:1 输入第一个数组的个数

2 输入第一个数组的数值

3 输入第二个数组的个数

4 输入第二个数组的数值

输出描述:输出合并之后的数组

while True:try:a,b,c,d=input(),list(map(int,input().split())),input(),list(map(int,input().split()))print("".join(map(str,sorted(list(set(b+d))))))except:break

79-字符串匹配

判断短字符串中的所有字符是否在长字符串中全部出现

详细描述:
接口说明
原型:
boolIsAllCharExist(char* pShortString,char* pLongString);
输入参数:char* pShortString:短字符串char* pLongString:长字符串

输入描述:输入两个字符串。第一个为短字符,第二个为长字符。

输出描述:返回值:true或false

while True:try:a,b=set(input()),set(input())print ("true" if a&b==a else "false")except:break

80-将真分数分解为埃及分数

分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。

接口说明/*功能: 将分数分解为埃及分数序列输入参数:String pcRealFraction:真分数(格式“8/11”)返回值:String pcEgpytFraction:分解后的埃及分数序列(格式“1/2+1/5+1/55+1/100”)*/public static String ConvertRealFractToEgpytFract(String pcRealFraction){return null;}

输入描述:输入一个真分数,String型

输出描述:输出分解后的string

while True:try:a = input().split('/')up = int(a[0])down = int(a[1])res = ''while up != 1:if down%(up-1) == 0:res = res + '1/' + str(down//(up-1)) + '+'up = 1else:q = down//upres = res + '1/'+ str(q+1) + '+'up = up - down%updown = down*(q+1)if down%up == 0:down = down//upup = 1res = res + '1/' + str(down)print(res)except:break

81-二维数组操作

有一个数据表格为二维数组(数组元素为int类型),行长度为ROW_LENGTH,列长度为COLUMN_LENGTH。对该表格中数据的操作可以在单个单元内,也可以对一个整行或整列进行操作,操作包括交换两个单元中的数据;插入某些行或列。

请编写程序,实现对表格的各种操作,并跟踪表格中数据在进行各种操作时,初始数据在表格中位置的变化轨迹。

详细要求:

1.数据表规格的表示方式为“行*列”, 数据表元素的位置表示方式为[行,列],行列均从0开始编号

2.数据表的最大规格为9行*9列,对表格进行操作时遇到超出规格应该返回错误

3.插入操作时,对m*n表格,插入行号只允许0m,插入列号只允许0n。超出范围应该返回错误

4.只需记录初始表格中数据的变化轨迹,查询超出初始表格的数据应返回错误

例如: 初始表格为44,可查询的元素范围为[0,0]~[3,3],假设插入了第2行,数组变为54,查询元素[4,0]时应该返回错误

5.查询数据要求返回一个链表,链表中节点的顺序即为该查询的数据在表格中的位置变化顺序(需包含初始位置)

输入描述:输入数据按下列顺序输入:

1 表格的行列值

2 要交换的两个单元格的行列值

3 输入要插入的行的数值

4 输入要插入的列的数值

5 输入要获取运动轨迹的单元格的值

输出描述:输出按下列顺序输出:

1 初始化表格是否成功,若成功则返回0, 否则返回-1

2 输出交换单元格是否成功

3 输出插入行是否成功

4 输出插入列是否成功

5 输出要查询的运动轨迹的单元查询是否成功

while True:try:m,n=list(map(int,input().split()))exchange=list(map(int,input().split()))insertrow=int(input())insertcol=int(input())trace=list(map(int,input().split()))res=[]if 0<=m<=9 and 0<=n<=9:res.append(0)else:res.append(-1)if 0<=exchange[0]<=m-1 and 0<=exchange[1]<=n-1 and 0<=exchange[2]<=m-1 and 0<=exchange[3]<=n-1:res.append(0)else:res.append(-1)if 0<=insertrow<=m-1:res.append(0)else:res.append(-1)if 0<=insertcol<=n-1:res.append(0)else:res.append(-1)if 0<=trace[0]<=m-1 and 0<=trace[1]<=n-1:res.append(0)else:res.append(-1)for i in res:print(i)except:break

82-统计大写字母个数

找出给定字符串中大写字符(即’A’-‘Z’)的个数

接口说明

原型:int CalcCapital(String str);

返回值:int

输入描述:输入一个String数据

输出描述:输出string中大写字母的个数

import sys
while True:try:s = input()count = 0for x in s:if 'A'<=x<='Z':count+=1print(count)except:sys.exit()

83-字符串运用-密码截取

Catcher 是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?

(注意:记得加上while处理多个测试用例)

输入描述:输入一个字符串

输出描述:返回有效密码串的最大长度

def get_count(str_in):if str_in == str_in[::-1]:return len(str_in)count = 0for ii in range(0, len(str_in)-1):if(ii-count-1>=0 and str_in[ii-count-1:ii+1] == str_in[ii-count-1:ii+1][::-1]):count += 2if(ii-count>=0 and str_in[ii-count:ii+1] == str_in[ii-count:ii+1][::-1]):count += 1return count
while True:try:str_in = input().strip()if str_in:print(get_count(str_in))except Exception as e:#print(e)break

84-求最大连续bit数

功能: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
输入: 一个byte型的数字
输出: 无
返回: 对应的二进制数字中1的最大连续数

输入描述:输入一个byte数字

输出描述:输出转成二进制之后连续1的个数

while True:try:num = bin(int(input()))[2:]#因为前面会有0b代表二进制n = num.split("0")length = 0for i in n:if len(i) > length:length = len(i)print(length)#print(num)except:break

85-密码强度等级

密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。

 一、密码长度:
5 分: 小于等于4 个字符
10 分: 5 到7 字符
25 分: 大于等于8 个字符
二、字母:
0 分: 没有字母
10 分: 全都是小(大)写字母
20 分: 大小写混合字母
三、数字:
0 分: 没有数字
10 分: 1 个数字
20 分: 大于1 个数字
四、符号:
0 分: 没有符号
10 分: 1 个符号
25 分: 大于1 个符号
五、奖励:
2 分: 字母和数字
3 分: 字母、数字和符号
5 分: 大小写字母、数字和符号
最后的评分标准:
\>= 90: 非常安全\>= 80: 安全(Secure)
\>= 70: 非常强\>= 60: 强(Strong)\>= 50: 一般(Average)\>= 25: 弱(Weak)\>= 0: 非常弱对应输出为:VERY_WEAK,WEAK,  AVERAGE,  STRONG,   VERY_STRONG,SECURE,   VERY_SECURE

​ 请根据输入的密码字符串,进行安全评定。

​ 注:

​ 字母:a-z, A-Z

​ 数字:-9

​ 符号包含如下: (ASCII码表可以在UltraEdit的菜单view->ASCII Table查看)

​ !"#$%&'()*+,-./ (ASCII码:x21~0x2F)

​ :;<=>?@ (ASCII<=><=><=><=><=>码:x3A~0x40)

​ []^_` (ASCII码:x5B~0x60)

{|}~ (ASCII码:x7B~0x7E)

接口描述:Input Param String pPasswordStr:  密码,以字符串方式存放。Return Value根据规则评定的安全等级。public static Safelevel GetPwdSecurityLevel(String pPasswordStr){/*在这里实现功能*/return null;}

输入描述:输入一个string的密码

输出描述:输出密码等级

while True:try:s=input()res=0if len(s)<=4:res+=5elif 5<=len(s)<=7:res+=10else:res+=25alpha_list=[]digit_list = []symbol_list=[]for i in s:if i.isalpha():alpha_list.append(i)if i.isdigit():digit_list.append(i)else:symbol_list.append(i)l=[0,0]for i in alpha_list:if ord(i) in range(97,123):l[0]=1if ord(i) in range(65,91):l[1]=1sum=l[0]+l[1]if sum==1:res+=10if sum==2:res+=20if len(digit_list)==1:res+=10if len(digit_list)>1:res+=20if len(symbol_list)==1:res+=10if len(symbol_list)>1:res+=25if len(alpha_list)!=0 and len(digit_list)!=0:res+=2elif len(alpha_list)!=0 and len(digit_list)!=0 and len(symbol_list)!=0:res+=3elif sum==2 and len(digit_list)!=0 and len(symbol_list)!=0:res+=5else:passif res>=90:print('VERY_SECURE')elif res>=80:print('SECURE')elif res>=70:print('VERY_STRONG')elif res>=60:print('STRONG')elif res>=50:print('AVERAGE')elif res>=25:print('WEAK')else:print('VERY_WEAK')except:break

86-扑克牌大小

扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A、2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
输入两手牌,两手牌之间用"-“连接,每手牌的每张牌以空格分隔,”-"两边没有空格,如:4 4 4 4-joker JOKER。
请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR。
基本规则:
(1)输入每手牌可能是个子、对子、顺子(连续5张)、三个、炸弹(四个)和对王中的一种,不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列;
(2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子);
(3)大小规则跟大家平时了解的常见规则相同,个子、对子、三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面所有的牌,炸弹之间比较牌面大小;对王是最大的牌;

(4)输入的两手牌不会出现相等的情况。

输入描述:输入两手牌,两手牌之间用"-“连接,每手牌的每张牌以空格分隔,”-"两边没有空格,如 4 4 4 4-joker JOKER。

输出描述:输出两手牌中较大的那手,不含连接符,扑克牌顺序不变,仍以空格隔开;如果不存在比较关系则输出ERROR。

A = '3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER'.split(' ')
while 1:try:s = input()if not s:breakexcept:breaka, b = s.split('-')w = Nonep, q = a.split(' '), b.split(' ')if len(q) != len(p):for t in p, q:if len(t) == 2 and t[0] == 'joker':w = ' '.join(t)breakelif len(t) == 4:w = ' '.join(t)if not w:w = 'ERROR'elif A.index(q[0]) > A.index(p[0]):w = belse:w = aprint (w)

87-合法IP

现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。

现在需要你用程序来判断IP是否合法。

输入描述:输入一个ip地址

输出描述:返回判断的结果YES or NO

while True:try:nums = list(map(int, input().split(".")))flag = 0for i in range(len(nums)):if nums[i] < 0 or nums[i] > 255:flag = 1else:passif flag == 0:print("YES")else:print("NO")except:break

88-棋盘路径

请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。

输入描述:输入两个正整数

输出描述:返回结果

def run(n, m):if n == 0 or m == 0:return 1else:return run(n-1, m) + run(n, m-1)while True:try:n, m = map(int, input().split())print(run(n, m))except:break

89-在字符串中找出连续最长的数字串

样例输出

输出123058789,函数返回值9

输出54761,函数返回值5

接口说明
函数原型:unsignedint Continumax(char** pOutputstr, char* intputstr)
输入参数:char* intputstr 输入字符串;
输出参数:char** pOutputstr: 连续最长的数字串,如果连续最长的数字串的长度为0,应该返回空字符串;如果输入字符串是空,也应该返回空字符串;
返回值:连续最长的数字串的长度

输入描述:输入一个字符串。

输出描述:输出字符串中最长的数字字符串和它的长度。如果有相同长度的串,则要一块儿输出,但是长度还是一串的长度

while True:try:a = input()maxLen, maxStrs, curLen, curStr = 0, [], 0, ""for i, v in enumerate(a):if v.isnumeric():curLen += 1curStr += vif curLen > maxLen:maxLen = curLenmaxStrs = [curStr]elif curLen == maxLen:maxStrs.append(curStr)else:curLen = 0curStr = ""print("".join(maxStrs) + "," + str(maxLen))except:break

90-数组能否分为两个满足条件的数组

编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true;不满足时返回false。

输入描述:第一行是数据个数,第二行是输入的数据

输出描述:返回true或者false

def part_data(data_list):part1 = list()part2 = list()part3 = list()for data in data_list:if data % 5 == 0:part1.append(data)elif data % 3 == 0:part2.append(data)else:part3.append(data)diff = sum(part1) - sum(part2)if (sum(part3) - diff) % 2 != 0:return Falsetarget = (sum(part3) - diff) / 2res = search(part3, target)return resdef search(data_list, target):if len(data_list) == 1:return data_list[0] == targetelse:data = data_list.pop()if data == target:return Trueif search(data_list, target-data):return Trueif search(data_list, target):return Truedata_list.append(data)while True:try:n = int(input().strip())data_list = list(map(int, input().strip().split()))res = part_data(data_list)print('true' if res == True else 'false')except:break

91-记票统计

请实现接口:
unsigned int AddCandidate (char* pCandidateName);
功能:设置候选人姓名
输入: char* pCandidateName 候选人姓名
输出:无
返回:输入值非法返回0,已经添加过返回0 ,添加成功返回1
Void Vote(char* pCandidateName);
功能:投票
输入: char* pCandidateName 候选人姓名
输出:无
返回:无
unsigned int GetVoteResult (char* pCandidateName);
功能:获取候选人的票数。如果传入为空指针,返回无效的票数,同时说明本次投票活动结束,释放资源
输入: char* pCandidateName 候选人姓名。当输入一个空指针时,返回无效的票数
输出:无
返回:该候选人获取的票数
void Clear()
// 功能:清除投票结果,释放所有资源
// 输入:
// 输出:无
// 返回

输入描述:输入候选人的人数,第二行输入候选人的名字,第三行输入投票人的人数,第四行输入投票。

输出描述:每行输出候选人的名字和得票数量。

while 1:try:num = 0d = {}n = int(input())m = input().split()rs = int(input())tp = input().split()for i in tp:d.setdefault(i,0)d[i]=d[i]+1for j in m:if j in d.keys():print(j+" : "+str(d[j]))else:print(j+" : 0")for k in d.keys():if k not in m:num = num + int(d[k])print("Invalid : "+str(num))except:break

92-人民币转换

考试题目和要点:

1、中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样填写。(30分)

2、中文大写金额数字到“元”为止的,在“元”之后,应写“整字,如¥ 532.00应写成“人民币伍佰叁拾贰元整”。在”角“和”分“后面不写”整字。(30分)

3、阿拉伯数字中间有“0”时,中文大写要写“零”字,阿拉伯数字中间连续有几个“0”时,中文大写金额中间只写一个“零”字,如¥6007.14,应写成“人民币陆仟零柒元壹角肆分“。

输入描述:输入一个double数

输出描述:输出人民币格式

import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
numberList=['零','壹','贰','叁','肆','伍','陆','柒','捌','玖']
integralUnit=['元','拾','佰','仟','万','拾','佰','仟','亿','拾','佰','仟']
fractionUnit=['角','分']def solveF(f,res):# print(res)if int(f) == 0:res.append("整")else:for i in range(len(f)):if int(f[i]) !=0:res.append(numberList[int(f[i])])# res.append(fractionUnit[int(f[i])])res.append(fractionUnit[int(i)])# print(res)return reswhile True:try:a = input()if '.' in a:a=a.split('.')else:a=(a+'.00').split('.')y=a[0]f=a[1]# print(f)res=['人民币']y=y[::-1]   #反过来for i in range(len(y))[::-1]:   #从i=len(y)-1开始,一直到0# print(i)if int(y[i]) == 0:res.append(numberList[0])else:res.append(numberList[int(y[i])])res.append(integralUnit[i])# print(res)    #有输出# res = ''.join(res)res=solveF(f,res)# print([i for i in range(100)])# 无输出res = ''.join(res)while ('零零' in res):res=res.replace('零零','零')res=res.replace('壹拾','拾')res=res.replace('人民币零','人民币')print(res)except:break

93-表示数字

将一个字符中所有出现的数字前后加上符号“*”,其他字符保持不变
public static String MarkNum(String pInStr)
{return null;
}
注意:输入数据可能有多行

输入描述:输入一个字符串

输出描述:字符中所有出现的数字前后加上符号“*”,其他字符保持不变

while True:try:string = input()length = len(string)out = []if string[0].isdigit():out.append('*')for i in range(length):if string[i].isalpha():if i>0 and string[i-1].isdigit():out.append('*')out.append(string[i])else:out.append(string[i])elif string[i-1].isalpha() and i>0:out.append('*')out.append(string[i])else:out.append(string[i])if string[-1].isdigit():out.append('*')print(''.join(out))except:break

94-记负均正

首先输入要输入的整数个数n,然后输入n个整数。输出为n个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。

输入描述:首先输入一个正整数n,然后输入n个整数。

输出描述:输出负数的个数,和所有正整数的平均值。

while True:try:n=int(input())data_list=map(int,input().split())num=0res=0geshu=0for i in data_list:if i>0:num+=1res+=ielif i<0:geshu+=1res = res/numprint("%d %.1f"%(geshu,res))except:break

95-自动售货系统

1 总体说明

考生需要模拟实现一个简单的自动售货系统,实现投币、购买商品、退币、查询库存商品及存钱盒信息的功能。

系统初始化时自动售货机中商品为6种商品,商品的单价参见1.1规格说明,存钱盒内放置1元、2元、5元、10元钱币,商品数量和钱币张数通过初始化命令设置,参见2.1 系统初始化。

1.1规格说明

\1. 商品:每种商品包含商品名称、单价、数量三种属性,其中商品名不重复。考生不能修改商品名称和单价,初始化命令设置商品数量。这些信息在考试框架中进行定义,考生在实现功能代码时可直接使用。

钱币面额 张数
10元 X
5元 X
2元 X
1元 X

\3. 退币原则

1) 根据系统存钱盒内钱币的 信息 ,按钱币总张数最少的原则进行退币。

2) 如果因零钱不足导致不能退币,则尽最大可能退币,以减少用户损失。

例如:假设存钱盒内只有4张2元,无其它面额钱币。如果需要退币7元,系统因零钱不足无法退币,则继续尝试退币6元,最终系统成功退币3张2元,用户损失1元钱币。

\4. 投币操作说明:每次投币成功,投入的钱币面额累加到投币余额;同时,本次投入的钱币放入存钱盒中,存钱盒相应面额钱币增加。

\5. 投币余额:指当前自动售货机中用户剩余的可购买商品的钱币总额;例如:投入2元面额的钱币,投币余额增加2元;购买一件价格2元的商品,投币余额减少2元;

\6. 投币余额约束:投币余额不能超过10元。

\7. 退币操作说明:退币操作需要遵守 退币原则 ;退币成功后,投币余额清零,同时扣除存钱盒相应的金额。

\8. 购买商品操作说明:一次仅允许购买一件商品;购买商品成功后,自动售货机中对应商品数量减1,投币余额扣除本次购买商品的价格。

2 操作说明

命令字与第一个参数间使用一个空格分隔,多条命令采用分号隔开。考试系统会对输入命令格式进行处理,考生不需要关注输入命令格式的合法性,只需要实现命令处理函数。

2.1 系统初始化

命令格式

r A1 数量 -A2 数量 -A3 数量 -A4 数量 -A5 数量 -A6 数量 1 元张数 -2 元张数 -5 元张数 -10 元张数

参数名称 参数说明 类型 取值范围
A1数量 商品A1数量 整数 [0,10]
A2数量 商品A2数量 整数 [0,10]
A3数量 商品A3数量 整数 [0,10]
A4数量 商品A4数量 整数 [0,10]
A5数量 商品A5数量 整数 [0,10]
A6数量 商品A6数量 整数 [0,10]
1元张数 面额1元钱币张数 整数 [0,10]
2元张数 面额2元钱币张数 整数 [0,10]
5元张数 面额5元钱币张数 整数 [0,10]
10元张数 面额10元钱币张数 整数 [0,10]

商品和各种面额钱币取值范围只是作为初始化命令的限制,其它场景下不限制取值范围;考试框架已经实现取值范围的检查,考生不需要关注。

功能说明:设置自动售货机中商品数量和存钱盒各种面额的钱币张数;

约束说明:系统在任意阶段均可执行r初始化系统;考生不需要关注参数的合法性,不需要关注增加或缺少参数的场景;

输出说明:输出操作成功提示(执行完r命令后系统会自动输出操作结果,考生不需要再次调用输出函数),例:

命令 输出 含义
r 6-5-4-3-2-1 4-3-2-1; S001:Initialization is successful 初始化成功

.2 投币

命令格式p 钱币面额

功能说明

(1) 如果投入非1元、2元、5元、10元的钱币面额(钱币面额不考虑负数、字符等非正整数的情况),输出“E002:Denomination error”;

(2) 如果存钱盒中1元和2元面额钱币总额小于本次投入的钱币面额,输出“E003:Change is not enough, pay fail”,但投入1元和2元面额钱币不受此限制。

(3) 如果投币余额大于10元,输出“E004:Pay the balance is beyond the scope biggest”;

(4) 如果自动售货机中商品全部销售完毕,投币失败。输出“E005:All the goods sold out”;

(5) 如果投币成功,输出“S002:Pay success,balance=X”;

约束说明

(1) 系统在任意阶段都可以投币;

(2) 一次投币只能投一张钱币;

(3) 同等条件下,错误码的优先级:E002 > E003 > E004 > E005;

输出说明:如果投币成功,输出“S002:Pay success,balance=X”。

例:

命令 输出
p 10; S002:Pay success,balance=10

2.3 购买商品

命令格式b 商品名称

功能说明

(1) 如果购买的商品不在商品列表中,输出“E006:Goods does not exist”;

(2) 如果所购买的商品的数量为0,输出“E007:The goods sold out”;

(3) 如果投币余额小于待购买商品价格,输出“E008:Lack of balance”;

(4) 如果购买成功,输出“S003:Buy success,balance=X”;

约束说明

(1) 一次购买操作仅能购买一件商品,可以多次购买;

(2) 同等条件下,错误码的优先级:E006 > E007 > E008;

输出说明:

如果购买成功,输出“S003:Buy success,balance=X”。

例:

命令 输出
b A1; S003:Buy success,balance=8

2.4 退币

命令格式c

功能说明

(1) 如果投币余额等于0的情况下,输出“E009:Work failure”;

(2) 如果投币余额大于0的情况下,按照 退币原则 进行“找零”,输出退币信息;

约束说明

(1) 系统在任意阶段都可以退币;

(2) 退币方式必须按照 退币原则 进行退币;

输出说明:如果退币成功,按照 退币原则 输出退币信息。

例,退5元钱币:

命令 输出
c; 1 yuan coin number=0 2 yuan coin number=0 5 yuan coin number=1 10 yuan coin number=0

2.5 查询

命令格式q 查询类别

功能说明

(1) 查询自动售货机中商品信息,包含商品名称、单价、数量。 根据商品数量从大到小进行排序;商品数量相同时,按照商品名称的先后顺序进行排序

例如:A1的商品名称先于A2的商品名称,A2的商品名称先于A3的商品名称。

(2) 查询存钱盒信息,包含各种面额钱币的张数;

(3) 查询类别如下表所示:

查询类别 查询内容
0 查询商品信息
1 查询存钱盒信息

如果“查询类别”参数错误,输出“E010:Parameter error”。“查询类别”参数错误时,不进行下面的处理;

输出说明

“查询类别”为0时,输出自动售货机中所有商品信息(商品名称单价数量)例:

命令 输出
q 0; A1 2 6 A2 3 5 A3 4 4 A4 5 3 A5 8 2 A6 6 0

“查询类别”为1时,输出存钱盒信息(各种面额钱币的张数),格式固定。例:

命令 输出
q 1; 1 yuan coin number=4 2 yuan coin number=3 5 yuan coin number=2 10 yuan coin number=1

输入描述:依照说明中的命令码格式输入命令。

输出描述:输出执行结果

import sys
while True:try:priceGoods = {'A1':2, 'A2':3, 'A3':4, 'A4':5, 'A5':8, 'A6':6}priceMoney = [1 , 2 , 5 , 10]numGoods = {'A1':0, 'A2':0, 'A3':0, 'A4':0, 'A5':0, 'A6':0}numMoney = [0] * 4balance = 0def printMoney(line):print ('1 yuan coin number=%s' % (line[0]))print ('2 yuan coin number=%s' % (line[1]))print ('5 yuan coin number=%s' % (line[2]))print ('10 yuan coin number=%s' % (line[3]))def printGoods(priceGoods,numGoods,flag):# 0:sorted goods name;1:sorted num of goodsif flag == 0:for i in range(6):good = 'A'+str(i+1)print (good+' '+str(priceGoods[good])+' '+str(numGoods[good]))if flag == 1:#print (numGoods)numGoodsSorted = sorted(numGoods.items(),key = lambda a:a[1],reverse = True)for i in range(6):print (numGoodsSorted[i][0]+' '+str(priceGoods[numGoodsSorted[i][0]])+' '+str(numGoodsSorted[i][1]))line = input().split(';')[:-1]for i in line:func = i.split()if func[0] == 'r':func[1] = func[1].split('-')for i in range(6):numGoods['A'+str(i+1)] += int(func[1][i])for i in range(4):numMoney[i] += int(func[2].split('-')[i]) #1 2 5 10print ('S001:Initialization is successful')elif func[0] == 'p':if int(func[1]) not in priceMoney:print ('E002:Denomination error')elif int(func[1]) in [5,10] and numMoney[0] + numMoney[1] * 2 < int(func[1]):print ('E003:Change is not enough, pay fail')elif int(func[1]) == 10 and balance > 10:# only print when $10 inputprint ('E004:Pay the balance is beyond the scope biggest')elif numGoods['A1'] == numGoods['A2'] == numGoods['A3'] == numGoods['A4'] == numGoods['A5'] == numGoods['A6'] == 0:print ('E005:All the goods sold out')else:numMoney[priceMoney.index(int(func[1]))] += 1balance += int(func[1])print ('S002:Pay success,balance=%d'%(balance))elif func[0] == 'b':if func[1] not in ['A1','A2','A3','A4','A5','A6']:print ('E006:Goods does not exist')elif numGoods[func[1]] == 0:print ('E007:The goods sold out')elif balance < priceGoods[func[1]]:print ('E008:Lack of balance')else:balance -= priceGoods[func[1]]numGoods[func[1]] -= 1print ('S003:Buy success,balance=%d'%(balance))elif func[0] == 'c':if balance == 0:sys.stdout.write('E009:Work failure')#no line breakelse:numCall = [0] * 4 #1 2 5 10for i in range(-1,-5,-1):numCall[i] = min(balance // priceMoney[i] , numMoney[i])balance -= numCall[i] * priceMoney[i]numMoney[i] -= numCall[i]printMoney(numCall)balance = 0elif func[0] == 'q':if func[1] == '0':printGoods(priceGoods,numGoods,1)elif func[1] == '1':printMoney(numMoney)else:sys.stdout.write('E010:Parameter error')#no line breakexcept:break

96-自守数

自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。请求出n以内的自守数的个数

接口说明
/*
功能: 求出n以内的自守数的个数
输入参数:
int n
返回值:
n以内自守数的数量。
*/public static int CalcAutomorphicNumbers( int n)
{/*在这里实现功能*/
return 0;
}

输入描述:int型整数

输出描述:n以内自守数的数量。

while True:try:num = int(input())count = 0for i in range(num + 1):j = str(i ** 2)k = j[-len(str(i)):]if str(i) == k:count += 1print(count)except:break

97-等差数列

功能:等差数列 2,5,8,11,14。。。。

输入:正整数N >0

输出:求等差数列前N项和

返回:转换成功返回 0 ,非法输入与异常返回-1

输入描述:输入一个正整数。

输出描述:输出一个相加后的整数。

while True:try:n=eval(input())num=0for i in range(n):num+=2+3*iprint(num)except:
#        print(-1)break

98-输入整型数组和排序标识,对其元素按照升序或降序进行排序

输入整型数组和排序标识,对其元素按照升序或降序进行排序(一组测试用例可能会有多组数据)

接口说明
原型:
void sortIntegerArray(Integer[] pIntegerArray, int iSortFlag);
输入参数:
Integer[] pIntegerArray:整型数组
int iSortFlag:排序标识:0表示按升序,1表示按降序
输出参数:
无
返回值:
void

输入描述:输入需要输入的整型数个数

输出描述:输出排好序的数字

while True:try:a,b,c=input(),map(int,input().split()),input()print(" ".join(map(str,sorted(b))) if c=="0" else " ".join(map(str,sorted(b,reverse=True))))except:break

99-字符统计

如果统计的个数相同,则按照ASCII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。

实现以下接口:
输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出
清空目前的统计结果,重新统计
调用者会保证:
输入的字符串以‘\0’结尾。

输入描述:输入一串字符。

输出描述:对字符中的各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。

while True:try:list1=[]arr = input()dic = {}for i in arr:if not (i.isalpha() or i.isdigit() or i.isspace()):continueelse:if i in dic:dic[i] += 1else:dic[i]=1dic=sorted(dic.items(),key = lambda x:x[0])#先按字符ASC排dic=sorted(dic,key = lambda x:x[1],reverse=True)#再按统计数目排print(''.join(k for (k , v) in dic))except:break

100-Redraiment的走法

Redraiment是走梅花桩的高手。Redraiment总是起点不限,从前到后,往高的桩子走,但走的步数最多,不知道为什么?你能替Redraiment研究他最多走的步数吗?

样例输入

6

2 5 1 5 4 5

样例输出

3

提示

Example:
6个点的高度各为 2 5 1 5 4 5
如从第1格开始走,最多为3步, 2 4 5
从第2格开始走,最多只有1步,5
而从第3格开始走最多有3步,1 4 5
从第5格开始走最多有2步,4 5

所以这个结果是3。

接口说明
方法原型:int GetResult(int num, int[] pInput, List pResult);
输入参数:int num:整数,表示数组元素的个数(保证有效)。int[] pInput: 数组,存放输入的数字。
输出参数:List pResult: 保证传入一个空的List,要求把结果放入第一个位置。
返回值:正确返回1,错误返回0

输入描述:输入多行,先输入数组的个数,再输入相应个数的整数

输出描述:输出结果

import bisectwhile True:try:a = int(input())b = map(int,input().split())c = []for i in b:x = bisect.bisect_left(c,i)if x == len(c):c.append(i)else:c[x] = iprint(len(c))except:break

101-字符串分割

连续输入字符串(输出次数为N,字符串长度小于100),请按长度为8拆分每个字符串后输出到新的字符串数组,

长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

首先输入一个整数,为要输入的字符串个数。

例如:

输入:2

abc

12345789

输出:abc00000

12345678

90000000

接口函数设计如下:
/*****************************************************************************
功能:存储输入的字符创
输入:字符串
输出:无
返回:0表示成功,其它返回-1
******************************************************************************/
int AddString(char *strValue);
/****************************************************************************
功能:获取补位后的二维数组的长度
输入:无
输出:无
返回:二维数组长度
*****************************************************************************/
int GetLength();
/*****************************************************************************
功能:将补位后的二维数组,与输入的二维数组做比较
输入:strInput:输入二维数组,iLen:输入的二维数组的长度
输出:无
返回:若相等,返回0;不相等,返回-1.其它:-1;
******************************************************************************/
int ArrCmp(char strInput[][9],int iLen);

输入描述:首先输入数字n,表示要输入多少个字符串。连续输入字符串(输出次数为N,字符串长度小于100)。

输出描述:按长度为8拆分每个字符串后输出到新的字符串数组,长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

while True:try:a = int(input())for i in range(a):s = input()while len(s)>8:print(s[:8])s = s[8:]print(s.ljust(8,'0'))except:break

102-记负均正II

从输入任意个整型数,统计其中的负数个数并求所有非负数的平均值

输入描述:输入任意个整数

输出描述:输出负数个数以及所有非负数的平均值

while True:try:inlist=list(map(int,input().split()))fushu=[]zhengshu=[]for i in inlist:if i<0:fushu.append(i)else:zhengshu.append(i)print(len(fushu))zhengshu_len=len(zhengshu)sum=0if zhengshu_len==0:print('0.0')else:for j in zhengshu:sum+=jprint(round((sum/zhengshu_len),1 ))except:break

103-字符逆序

将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。 如:输入“I am a student”,输出“tneduts a ma I”。

输入参数:

inputString:输入的字符串

返回值:

输出转换好的逆序字符串

输入描述:输入一个字符串,可以有空格

输出描述:输出逆序的字符串

print (input()[::-1])

104-求解立方根

计算一个数字的立方根,不使用库函数

详细描述:
接口说明
原型:
public static double getCubeRoot(double input)
输入:double 待求解参数
返回值:double 输入参数的立方根,保留一位小数

输入描述:待求解参数 double类型

输出描述:输入参数的立方根 也是double类型

def lifang(a):a=float(a)return a**(1/3)b=input()
print('%0.1f'%lifang(b))

105-求最小公倍数

正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

输入描述:输入两个正整数A和B。

输出描述:输出A和B的最小公倍数。

#coding:utf-8
import sys
while True:try:s = sys.stdin.readline().strip()a = int(s.split()[0])b = int(s.split()[1])m=an=bwhile(a!=b):if a>b:a=a-belse:b=b-aprint(int(m*n/a))except Exception:break

机试整理(python)相关推荐

  1. 华为机试(Python)真题Od【A卷+B卷】

    各语言题库: [Python+JS+Java合集][超值优惠]:Py/JS/Java合集 [Python]:Python真题题库 [JavaScript]:JavaScript真题题库 [Java]: ...

  2. 华为OD机试(Python)真题目录汇总(20222023)

    1.其它语言华为OD机试真题目录 华为OD机试(JAVA)真题目录汇总 华为OD机试(C++)真题目录汇总 华为OD机试(JavaScript)真题目录汇总 2.Python语言实现华为OD机试目录 ...

  3. 牛客网华为机试(python)

    前言 牛客网华为机试(https://www.nowcoder.com/exam/oj/ta?tpId=37) 按难度分为入门,简单,中等,困难,较难五个等级 目录标题 前言 一,入门 二,简单 一, ...

  4. 华为机试支持python吗_4.10华为暑期实习生机试题目,python解答

    第一题是给一个字符串,然后按照次数和ascii码的顺序,循环输出.比如输入eeefffggh,由于ascii的大小,e 'efgh'  + 'efg'   +  'ef'   =  'efghefge ...

  5. 【100%通过率 】【华为OD机试c++/python】攻城战【 2023 Q1考试题 A卷 |200分】

    华为OD机试- 题目列表 2023Q1 点这里!! 2023华为OD机试-刷题指南 点这里!! ■ 题目描述 一支攻城部队,有若干种大炮各座,以及数量有限的火药,每种大炮的威力不尽相同, 且在每次开火 ...

  6. 【100%通过率 】【华为OD机试c++/python】钟表重合时刻【 2023 Q1考试题 A卷|100分】

    华为OD机试- 题目列表 2023Q1 点这里!! 2023华为OD机试-刷题指南 点这里!! ■ 题目描述 钟表是日常生活中不可缺少的时间度量计, 其时针.分针.秒针三者的转动速度满足特定规律(见备 ...

  7. 【100%通过率】华为OD机试C++/python【密室逃生游戏】【2022.11 Q4 新题|100分】

    华为OD机试- 题目列表 2023Q1 点这里!! 2023华为OD机试-刷题指南 点这里!! 题目描述 小强在参加<密室逃生>游戏,当前关卡要求找到符合给定 密码K(升序的不重复小写字母 ...

  8. 【100%通过率 】【华为OD机试c++\python】AI处理器组合【2023 Q1|100分】

    华为OD机试- 题目列表 2023Q1 点这里!! 2023华为OD机试-刷题指南 点这里!! 题目描述 某公司研发了一款高性能AI处理器. 每台物理设备具备8颗AI处理器, 编号分别为0.1.2.3 ...

  9. 华为OD机试 - 整理扑克牌(Java JS Python)

    题目描述 给定一组数字,表示扑克牌的牌面数字,忽略扑克牌的花色,请按如下规则对这一组扑克牌进行整理: 步骤1. 对扑克牌进行分组,形成组合牌,规则如下: 当牌面数字相同张数大于等于4时,组合牌为&qu ...

最新文章

  1. 《那些年啊,那些事——一个程序员的奋斗史15》
  2. 灰鸽子木马的原理和清除方法
  3. win7映射linux硬盘_win7下安装Linux实现双系统全攻略
  4. [BUUCTF-pwn]——inndy_rop
  5. python第一周:python初识、流程控制
  6. 深度有趣 | 30 快速图像风格迁移
  7. 速战速决?你不会是不行吧......
  8. [数据结构]对称矩阵和三角矩阵压缩公式
  9. 【Hihocoder - offer编程练习赛39 - D】前缀后缀查询(后缀字典树,哈希,思维)
  10. Spring的基本使用
  11. 论文笔记_S2D.42_2018-CRV_为经典图像处理辩护:在CPU上的快速深度补全
  12. 装双系统win10和android,教你安装Win10和安卓Android双系统(不是模拟器)
  13. python加粗线宽代码_python-增加matplotlib中图例行的线宽
  14. linux卸载usb声卡,Linux alsa 声卡驱动 安装 卸载 设置默认声卡
  15. Mybatis使用choose when
  16. ios 查看crash日志
  17. 使用Dreamweaver进行一个简单的图文混排1/HTML
  18. 湖南计算机专修学院20年同学聚会,20年后的一次同学聚会
  19. Kali使用apt-cache search搜索想要的软件包
  20. Linux日常运维1 w vmstat top sar nload io free ps tcpdump

热门文章

  1. java 生成静态页面——Freemarker实例教程
  2. OracleParameter 的使用(参数名要以:开头,不允许包含@等特殊字符)
  3. Android 快速开发系列 打造万能的ListView GridView 适配器
  4. 图像算法:Difference of Gaussian(DOG) 高斯函数差分
  5. Bash Export命令
  6. pdf怎么转成html?
  7. 简述JS中THIS的指向?
  8. 如何万网域名解析亚马逊服务器,使用aws ELB后关于proxy_pass 的域名解析问题
  9. JavaScript在线文本编辑的实现
  10. CTFSHOW SSTI入门