
- 一、牛客-简单类
- 1、HJ81 字符串字符匹配--SET使用
- 2、二维数组 *** 作--map(),split()使用
- 3、HJ8 合并表记录--sorted()、字典输出
- 4、HJ80 整型数组合并--join()、set()、多input写一行、列表转字符串
- 5、HJ6 质数因子--while与if、math.sqrt、end=" "、整除//
- 6、HJ51 输出单向链表中倒数第k个结点
一、牛客-简单类 1、HJ81 字符串字符匹配–SET使用
描述
判断短字符串S中的所有字符是否在长字符串T中全部出现。
请注意本题有多组样例输入。
数据范围:1\le len(S),len(T)\le200\1≤len(S),len(T)≤200
进阶:时间复杂度:O(n)\O(n) ,空间复杂度:O(n)\O(n)
输入描述:
输入两个字符串。第一个为短字符串,第二个为长字符串。两个字符串均由小写字母组成。
输出描述:
如果短字符串的所有字符均在长字符串中出现过,则输出字符串"true"。否则输出字符串"false"。
示例1
输入:
bc
abc
复制
输出:
true
复制
说明:
其中abc含有bc,输出"true"
while True:
try:
s1=input()
s2=input()
if set(s1)<=set(s2):
print("true")
else:
print("false")
except:
break
set():创建一个无序不重复元素集,能够进行交集、并集、差集计算。
2、二维数组 *** 作–map(),split()使用map():根据提供的函数,对指定序列进行转换,返回迭代器。一般转换为list。
split():通过分隔符对字符串进行分隔,第二个参数num默认为-1,代表分隔所有,否则则分隔为num+1个元素。返回值为列表。
描述
有一个mn\m∗n 大小的数据表,你会依次进行以下5种 *** 作:
1.输入m\m 和n\n ,初始化mn\m∗n 大小的表格。
2.输入x_1x1、y_1y1、x_2x2、y_2y2,交换坐标在(x_1,y_1)(x1,y1)和(x_2,y_2)(x2,y2)的两个数。
3.输入x\x ,在第x\x 行上方添加一行。
4.输入y\y ,在第y\y 列左边添加一列。
5.输入x\x 、y\y ,查找坐标为(x,y)(x,y) 的单元格的值。
请编写程序,判断对表格的各种 *** 作是否合法。
详细要求:
1.数据表的最大规格为9行9列,对表格进行 *** 作时遇到超出规格应该返回错误。
2.对于插入 *** 作,如果插入后行数或列数超过9了则应返回错误。如果插入成功了则将数据表恢复至初始化的mn\m∗n 大小,多出的数据则应舍弃。
3.所有输入坐标 *** 作,对m*n\m∗n 大小的表格,行号坐标只允许0m-1,列号坐标只允许0n-1。超出范围应该返回错误。
本题含有多组样例输入!行列从0开始标号
数据范围:数据组数:1\le t\le 5\1≤t≤5
进阶:时间复杂度:O(1)\O(1) ,空间复杂度:O(1)\O(1)
输入描述:
输入数据按下列顺序输入:
1 表格的行列值
2 要交换的两个单元格的行列值
3 输入要插入的行的数值
4 输入要插入的列的数值
5 输入要查询的单元格的坐标
输出描述:
输出按下列顺序输出:
1 初始化表格是否成功,若成功则返回0, 否则返回-1
2 输出交换单元格是否成功
3 输出插入行是否成功
4 输出插入列是否成功
5 输出查询单元格数据是否成功
示例1
输入:
4 9
5 1 2 6
0
8
2 3
4 7
4 2 3 2
3
3
4 7
复制
输出:
0
-1
0
-1
0
0
-1
0
0
-1
复制
说明:
本组样例共有2组样例输入。
第一组样例:
1.初始化数据表为4行9列,成功
2.交换第5行1列和第2行6列的数据,失败。因为行的范围应该是(0,3),不存在第5行。
3.在第0行上方添加一行,成功。
4.在第8列左边添加一列,失败。因为列的总数已经达到了9的上限。
5.查询第2行第3列的值,成功。
第二组样例:
1.初始化数据表为4行7列,成功
2.交换第4行2列和第3行2列的数据,失败。因为行的范围应该是(0,3),不存在第4行。
3.在第3行上方添加一行,成功。
4.在第3列左边添加一列,成功。
5.查询第4行7列的值,失败。因为虽然添加了一行一列,但数据表会在添加后恢复成4行7列的形态,所以行的区间仍然在[0,3],列的区间仍然在[0,6],无法查询到(4,7)坐标。
while True:
try:
m,n=map(int,input().split())
x,y,z,t=map(int,input().split())
insert_x=int(input())
insert_y=int(input())
i,j=map(int,input().split())
if 0
3、HJ8 合并表记录–sorted()、字典输出
sorted():针对可遍历对象进行排序,生成新的列表。
sort():只可针对列表排序。
# 针对字典,则根据key进行默认的升序,然后输出key的升序列表
a={'0':'5','1':'7'}
sorted(a)
>>>[0,1]
# 第二个参数:key
a=[{'age':25,'name':'Jack'},{'age':20,'name':'Mack'}]
sorted(a,key=lambda x:x['age'])
>>>[{'age':20,'name':'Mack'},{'age':25,'name':'Jack'}]
# 第三个参数:reserve=False,默认Falue为升序,True为倒序。
a=[3,2,6,7,1]
sorted(a,reserve=True)
>>>[7,6,3,2,1]
描述
数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
提示:
0 <= index <= 11111111
1 <= value <= 100000
输入描述:
先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
输入:
4
0 1
0 2
1 2
3 4
复制
输出:
0 3
1 2
3 4
while True:
try:
n=int(input())
dct={}
for i in range(n):
key,value=map(int,input().split())
if key not in dct:
dct[key]=value
else:
dct[key]+=value
for i in sorted(dct):
print(i,dct[i])
except:
break
4、HJ80 整型数组合并–join()、set()、多input写一行、列表转字符串
join():将序列(可以是字符串,不能是int)以指定的字符进行拼接,形成字符串。
列表变成字符串map(str,lst)
描述
题目标题:
将两个整型数组按照升序合并,并且过滤掉重复数组元素。
输出时相邻两数之间没有空格。
输入描述:
输入说明,按下列顺序输入:
1 输入第一个数组的个数
2 输入第一个数组的数值
3 输入第二个数组的个数
4 输入第二个数组的数值
输出描述:
输出合并之后的数组
示例1
输入:
3
1 2 5
4
-1 0 3 2
复制
输出:
-101235
while True:
try:
m,x,n,y=input(),input().split(),input(),input().split()
res=map(str,sorted(map(int,set(x+y))))
print(''.join(res))
except:
break
5、HJ6 质数因子–while与if、math.sqrt、end=" "、整除//
描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
数据范围: 1 \le n \le 2 \times 10^{9} + 14 \1≤n≤2×10
9
+14
输入描述:
输入一个整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。
示例1
输入:
180
复制
输出:
2 2 3 3 5
import math
while True:
try:
n=int(input())
for i in range(2,int(math.sqrt(n))+1):
while n%i==0:
print(i,end=" ")
n=n//i
if n>2:
print(n)
except:
break
# 可能质数因子是本身
# 可能剩下来的质数大于n^1/2
# math.sqrt()的使用,这是求质数时减少算法的必用方法
# 最好的办法:每次能被除的时候,直接输出,结尾带上end=" "
# n=n//i,每次被除完,n需要更新值。且//代表整除,/有1位小数。
# while 和 if的区别:if循环语句只执行1次,成功就不回来。while条件判断,遇到FALSE才退出循环
6、HJ51 输出单向链表中倒数第k个结点
解题思路:创建节点类,创建链表类(包含判断是否为空、元素添加、输出第N个节点值)。目标函数:创建实例,再调用添加、输出的方法。
描述
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
正常返回倒数第k个结点指针,异常返回空指针.
要求:
(1)正序构建链表;
(2)构建后要忘记链表长度。
数据范围:链表长度满足 1 \le n \le 1000 \1≤n≤1000 , k \le n \k≤n ,链表中数据满足 0 \le val \le 10000 \0≤val≤10000
本题有多组样例输入。
输入描述:
输入说明
1 输入链表结点个数
2 输入链表的值
3 输入k的值
输出描述:
输出一个整数
示例1
输入:
8
1 2 3 4 5 6 7 8
4
复制
输出:
5
# 定义一个结点类
class Node(object):
# 初始化类的属性
def __init__(self,data):
self.data=data
self.next=None # 用来保存下一个结点对象,初始化为None
# 定义一个链表类
class LinkList(object):
def __init__(self,node=None):
self.head=node
# 判断链表是否为空
def is_empty(self):
if self.head is None:
return True
else:
return False
# 链表尾部添加对象,首先一定得判断链表是否为空
def append(self,item):
node=Node(item) # 用item的值,创建链表
if self.is_empty():
self.head=node
else:
cur=self.head
while cur.next is not None:
cur=cur.next
cur.next=node
# 输出打印第N个节点的值
def print_node(self,num):
cur=self.head
for i in range(0,num-1):
cur=cur.next
print(cur.data)
if __name__=='__main__':
while True:
try:
n,lst,k=int(input()),input().split(),int(input())
if k==0:
print(0)
else:
# 注意给单链表添加元素的方法
link_lst=LinkList()
for i in lst:
link_lst.append(i)
link_lst.print_node(n-k+1) # 此处可直接输出结果
except:
break
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)