今天分享两道算法题,自己刚开始练习,可能在解法上不是最佳的,但是只提供一些自己的思路,欢迎大家多多指教~
第一题
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = "leetcode"
输出: false
示例 2:
输入: s = "abc"
输出: true
限制:
- 0 <= len(s) <= 100
- s[i]仅包含小写字母
- 如果你不使用额外的数据结构,会很加分。
解法
:将字符串分别按字符进行循环,存到一个list列表中,再使用set方法进行去重复,如果这样处理完之后的set集合的长度和原字符串长度相同,那么此字符串s的所有字符全都不同,反之处理后的长度会小于原字符串长度。
代码
:
class Solution:
def isUnique(self, astr: str) -> bool:
res = []
for i in astr:
res.append(i)
res = set(res)
return len(res) == len(astr)
第二题
mex
时间限制: 2000/1000 MS (Java/Others)
内存限制: 65536/65536 K (Java/Others)
问题描述
若S表示一个非负整数集合,mex(S)的值为不属于集合S的最小非负整数。例如,mex({0, 1, 4}) = 2,mex({1, 2}) = 0。
有n个互不相同的非负整数a1, a2, … an 构成了一个非负整数集合A。小美想知道若将ai (1 ≤ i ≤ n)从集合A中删除,剩下的n-1个数构成的新集合A’的mex值为多少?请输出i从1到n 所有取值下新集合的mex值。
输入描述
第一行输入一个整数n,表示集合A的大小。
第二行输入n个整数a1, a2, … an 。
输出描述
输出n个整数,相邻两个数之间用空格隔开。其中第i个数表示从集合A中删除ai,剩下n-1 个数构成的新集合的mex值 。
输入样例1
4
5 0 3 1
输出样例1
2 0 2 1
数据范围和说明
对于80%的数据, 2 ≤ n ≤ 100, 0 ≤ ai ≤ 100
对于100%的数据,2 ≤ n ≤ 50000, 0 ≤ ai ≤ 109,保证ai互不相同。
样例说明
删除第1个数5,mex({0, 1, 3}) = 2;
删除第2个数0,mex({5, 3, 1}) = 0;
删除第3个数3,mex({5, 0, 1}) = 2;
删除第4个数1,mex({5, 0, 3}) = 1。
解法
:
- 首先input函数读取序列长度和序列值组成的列表。
- 先创建一个结果列表res
- 定义mex函数,在对序列值列表的循环过程中拿到每次循环时除当前值之外的剩余元素的列表rest
- 根据题目的要求,目标值肯定不大于rest列表的最大值,那么从0开始循环,如果找到第一个不在rest列表中的值则break,并把此值添加到res列表中,最后循环完整个原始序列之后,返回的就是需要的结果组成的列表
- 调用函数,将结果依次打印出来
n = input()
arrays = list(map(int, input().split(' ')))
# print(n)
# print(arrays)
res = []
def mex(arrays):
for i in arrays:
rest = []
# print(i)
for j in arrays:
if j != i:
rest.append(j)
# print(rest)
# 找到目标值
for element in rest:
for i in range(max(rest)):
if i not in rest:
res.append(i)
break
break
# print(res)
return res
res = mex(arrays)
for i in res:
print(i,end=" ")