OD机试题练习(二)

1. 合并表记录

描述:数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
输入描述:先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开
输出描述:输出合并后的键值对(多行)
示例一:
输入 :
4
0 1
0 2
1 2
3 4
输出:
0 3
1 2
3 4
示例二:
输入:
3
0 1
0 2
8 9
输出:
0 3
8 9
参考代码:

import sys
tmp_list = []
for line in sys.stdin:
	a = line.split()
	tmp_list.append(a)

count = int(tmp_list[0][0])
ele_list = tmp_list[1:]
result = []
n = 0
while n < count:
	m = n + 1
	tmp = ele_list[n]
	while m < count:
		if int(tmp[0]) == int(ele_list[m][0]):
			tmp = [tmp[0],str(int(tmp[1]) + int(ele_list[m][1]))]
		m += 1
	flag = True
	for k,v in result:
		if int(k) == int(tmp[0]):
		flag = False
	if flag:
		result.append(tmp)
	n += 1
new_index = [ int(k) for k,v in result ]
new_index.sort()
new_result = []
for index in new_index:
	for k,v in result:
		if index == int(k):
			new_result.append([k,v])
for k,v in new_result:
	print(k,v)

2. 提取不重复的整数

描述:输入一个 int 型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。保证输入的整数最后一位不是 0 。
输入描述:按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
示例1:
输入:9876673
输出:37689
参考代码:

import sys
tmp_list = None
for line in sys.stdin:
	a = line.split()[0]
	tmp_list = list(a)
tmp_list.reverse()
result = []
n = 0
while n < len(tmp_list):
	if tmp_list[n] not in result:
		result.append(tmp_list[n])
	n += 1
print(''.join(result))

3. 字符个数统计

描述:编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次,例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。
输入描述:输入一行没有空格的字符串。
输出描述:输出 输入字符串 中范围在(0~127,包括0和127)字符的种数。
示例1:
输入:abc
输出:3
示例2:
输入:aaa
输出:1
参考代码:

import sys
for line in sys.stdin:
	a = line.split()[0]
	a_set = set(a)
	print(len(a_set))

4. 数字颠倒

描述:输入一个整数,将这个整数以字符串的形式逆序输出程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
输入描述:输入一个int整数
输出描述:将这个整数以字符串的形式逆序输出
示例1:
输入:1516000
输出:0006151
示例2:
输入:0
输出:0
参考代码:

import sys
for line in sys.stdin:
	a = line.split()[0]
	b = list(a)
	b.reverse()
	print(''.join(b))

5. 字符串反转

描述:接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。
输入描述:输入一行,为一个只包含小写字母的字符串。
输出描述:输出该字符串反转后的字符串。
示例1:
输入:abcd
输出:dcba
参考代码:

import sys
for line in sys.stdin:
	a = line.split()[0]
	b = list(a)
	b.reverse()
	print(''.join(b))

6.句子逆序

描述:将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”

所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
输入描述:输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。
输出描述:得到逆序的句子
示例1:
输入:I am a boy
输出:boy a am I
示例2:
输入:nowcoder
输出:nowcoder
参考代码:

import sys
for line in sys.stdin:
	a = line.split()
	a.reverse()
	print(' '.join(a))

7.字符串排序

描述:给定 n 个字符串,请对 n 个字符串按照字典序排列。
输入描述:输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。
输出描述:数据输出n行,输出结果为按照字典序排列的字符串。
示例1:
输入:
9
cap
to
cat
card
two
too
up
boat
boot
输出:
boat
boot
cap
card
cat
to
too
two
up
参考代码:

import sys
tmp_list = []
for line in sys.stdin:
	a = line.split()[0]
	tmp_list.append(a)
tmp_list = tmp_list[1:]
tmp_list.sort()
for _ in tmp_list:
	print(_)

8. 求int型正整数在内存中存储时1的个数

描述:输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。
输入描述:输入一个整数(int类型)
输出描述:这个数转换成2进制后,输出1的个数
示例1:
输入:5
输出:2
示例2:
输入:0
输出:0
参考代码:

import sys
for line in sys.stdin:
	a = line.split()[0]
	b = bin(int(a))[2:].count('1')
	print(b)

9.坐标移动

描述:开发一个坐标计算工具, 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)
    输入描述:一行字符串
    输出描述:最终坐标,以逗号分隔
    示例1
    输入:A10;S20;W10;D30;X;A1A;B10A11;;A10;
    输出:10,-10
    示例2
    输入:ABC;AKL;DA1;
    输出:0,0
    参考代码:
import sys
import re
tmp_list = None
for line in sys.stdin:
	a = line.split()[0].split(";")
	tmp_list = list(a)
new_list = []
pattern = r"^[AWDS]\d+$"
for _ in tmp_list:
	if re.match(pattern,_)
		new_list.append(_)
X = 0
Y = 0
for _ in new_list:
	if _[0] == 'A':
		X -= int(_[1:])
	elif _[0] == 'S':
		Y -= int(_[1:])
	elif _[0] == 'W':
		Y += int(_[1:])
	elif _[0] == 'D':
		X += int(_[1:])

print("{},{}".format(X,Y))

10.简单密码

描述:现在有一种密码变换算法。
九键手机键盘上的数字与字母的对应: 1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0,把密码中出现的小写字母都变成九键键盘对应的数字,如:a 变成 2,x 变成 9.
而密码中出现的大写字母则变成小写之后往后移一位,如:X ,先变成小写,再往后移一位,变成了 y ,例外:Z 往后移是 a 。
数字和其它的符号都不做变换。
输入描述:输入一组密码,长度不超过100个字符。
输出描述:输出密码变换后的字符串
示例1:
输入:YUANzhi1987
输出:zvbo9441987
参考代码:

import sys
tmp_str = None
for line in sys.stdin:
	tmp_str = line.split()[0]
password_dict = {
	"abc": "2",
    "def": "3",
    "ghi": "4",
    "jkl": "5",
    "mno": "6",
    "pqrs": "7",
    "tuv": "8",
    "wxyz": "9",
}
result = ""
for _ in tmp_str:
	if _.isupper():
		t = _.lower()
		if t == "z":
			result += "a"
		else:
			tmp = ord(t) + 1
			result += chr(tmp)
	elif _.isnumeric():
		result += _
	else:
		for k,v in password_dict.items():
			if _ in k:
				result += v
			break
print(result)

11.汽水瓶

描述:某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。
小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
输入描述:对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
示例1:
输入:
3
10
81
0
输出:
1
5
40
参考代码:

import sys
tmp_list = []
for line in sys.stdin:
	a = line.split()[0]
	tmp_list.append(a)
def fun(N):
	if N == 0 or N == 1:
		return 
	if N == 2:
		return 1
	if N == 3:
		return 1
	count = N // 3
	mod = N % 3
	return count + fun(count + mod)
  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值