确定字符串是否包含唯一字符
挑战介绍
实现一个算法来识别一个字符串的字符是否是唯一的。
挑战内容
本次挑战中,你需要在 unique_chars.py
文件中补充函数 has_unique_chars
的空缺部分。
has_unique_chars
函数接受一个参数,string
用于指定传入的字符串;has_unique_chars
函数输出一个布尔值,即True
或者False
。
你需要补充 has_unique_chars
函数,使其可以识别传入的 string
字符串的字符是否是唯一的,即有没有重复的字符。要求如下:
- 如果传入字符串的字符是唯一的,则返回
True
; - 如果传入字符串的字符是有重复的,则返回
False
; - 如果传入的字符串为
None
,也返回False
。
挑战要求
- 代码必须写入
unique_chars.py
文件中,且不能修改示例代码中出现的类名和函数名。 - 请自行在环境主目录下新建
unique_chars.py
文件,并复制示例代码到文件中完成补充。补充完整后点击「提交检测」,系统将会给出判定结果。
示例代码
class UniqueChars(object):
def has_unique_chars(self, string):
### 补充代码 ###
return ### 补充代码 ###
小贴士
- 为了保证能被系统准确检测,挑战中的每一句话都非常重要,请仔细阅读。跳跃式浏览易导致挑战无法按要求通过。
版权说明
内容编译自 Donne Martin 的开源项目,该项目使用 Apache 2.0 LICENSE。
参考答案:
class UniqueChars(object):
def has_unique_chars(self, string):
if string is None:
return False
return len(set(string)) == len(string)
代码分析:
上述代码定义了一个UniqueChars
类,其中包含一个has_unique_chars
方法,该方法首先检查输入的字符串是否为空,然后通过比较原始字符串长度和转换为集合后去重字符串的长度,来判断字符串中的字符是否都是唯一的,若长度相同则返回True
,表示字符唯一,否则返回False
。
确定字符串是否是另一个的排列
挑战介绍
实现一个算法来识别一个字符串 str2
是否是另一个字符串 str1
的排列。排列的解释如下:
- 如果将
str1
的字符拆分开,重新排列后再拼接起来,能够得到str2
,那么就说字符串str2
是字符串str1
的排列。
挑战内容
本次挑战中,你需要在 permutation.py
文件中补充函数 is_permutation
的空缺部分。
is_permutation
函数接受两个参数,str1
,str2
用于指定传入的两个字符串;is_permutation
函数输出一个布尔值,即True
或者False
。
你需要补充 is_permutation
函数,使其可以识别 str2
字符串是否是 str1
字符串的排列。要求如下:
- 如果
str2
字符串是str1
字符串的排列,则返回True
; - 如果
str2
字符串不是str1
字符串的排列,则返回False
; - 如果传入的字符串有
None
,或者有空字符串,则返回False
。
挑战要求
- 代码必须写入
permutation.py
文件中,且不能修改示例代码中出现的类名和函数名。 - 请自行在环境主目录下新建
permutation.py
文件,并复制示例代码到文件中完成补充。补充完整后点击「提交检测」,系统将会给出判定结果。
示例代码
class Permutations(object):
def is_permutation(self, str1, str2):
### 补充代码 ###
pass ### 请删除pass ###
版权说明
内容编译自 Donne Martin 的开源项目,该项目使用 Apache 2.0 LICENSE,我们修改了部分解题和单元测试代码以适应实验楼在线环境。
参考答案:
class Permutations(object):
def is_permutation(self, str1, str2):
if str1 is None or str2 is None:
return False
return sorted(str1) == sorted(str2)
代码分析:
这段代码定义了一个Permutations
类,并在其中实现了一个is_permutation
方法。该方法用于快速判断两个字符串是否互为字符排列,即它们是否包含相同数量和种类的字符。代码首先检查输入字符串是否为None
,若是则返回False
。接下来,通过对两个字符串进行排序并比较排序后的结果,若相同则返回True
,表明它们是字符排列;若不同则返回False
。
确定字符串是否是另一个的旋转
挑战介绍
实现一个算法来识别一个字符串 s2
是否是另一个字符串 s1
的旋转。旋转的解释如下:
- 如果将
s1
从某个位置断开,拆分成两个字符串(可能有一个为空字符串),再将这两个字符串调换顺序后拼接起来,能够得到s2
,那么说字符串s2
是字符串s1
的旋转。
挑战内容
本次挑战中,你需要在 rotation.py
文件中补充函数 is_substring
及函数 is_rotation
的空缺部分。
-
is_substring
函数接受两个参数,s1
,s2
用于指定传入的两个字符串; -
is_substring
函数用于判断传入的一个字符串是否是另一个的子字符串,它需要返回一个布尔值。 -
is_rotation
函数接受两个参数,s1
,s2
用于指定传入的两个字符串; -
is_rotation
函数需调用is_substring
函数,但仅可调用一次; -
is_rotation
函数输出一个布尔值,即True
或者False
。
你需要补充 is_substring
函数及 is_rotation
函数,使 is_rotation
函数可以识别传入的 s2
字符串是否是 s1
字符串的旋转。要求如下:
- 如果
s2
字符串是s1
字符串的旋转,则返回True
; - 如果
s2
字符串不是s1
字符串的旋转,则返回False
; - 如果传入的字符串有一个是
None
或者空字符,但另外一个不是时,也返回False
。
挑战要求
- 代码必须写入
rotation.py
文件中,且不能修改示例代码中出现的类名和函数名。 - 请自行在环境主目录下新建
rotation.py
文件,并复制示例代码到文件中完成补充。补充完整后点击「提交检测」,系统将会给出判定结果。
示例代码
class Rotation(object):
def is_substring(self, s1, s2):
### 补充代码 ###
pass
def is_rotation(self, s1, s2):
### 补充代码 ###
### 仅仅调用一次 is_substring 函数 ###
pass
版权说明
内容编译自 Donne Martin 的开源项目,该项目使用 Apache 2.0 LICENSE,我们修改了部分解题和单元测试代码以适应实验楼在线环境。
参考答案:
class Rotation(object):
def is_substring(self, s1, s2):
return s1 in s2
def is_rotation(self, s1, s2):
if s1 is None or s2 is None:
return False
if len(s1) != len(s2):
return False
return self.is_substring(s1, s2 + s2)
代码分析:
这段代码定义了一个Rotation
类,其中包含两个方法:is_substring
和is_rotation
。
is_substring方法:
- 这个方法检查字符串
s1
是否是字符串s2
的子串。 - 它使用Python的
in
操作符来判断,这是一个简洁而高效的方法。 - 时间复杂度:O(n*m),其中n是
s1
的长度,m是s2
的长度。因为in
操作在最坏的情况下需要遍历整个s2
字符串来查找s1
。
is_rotation方法:
- 此方法用于判断字符串
s1
是否可以通过循环移位(旋转)得到字符串s2
。 - 首先,它检查
s1
和s2
是否为None
,以及它们的长度是否相等。如果不满足这些条件,方法直接返回False
。 - 接下来,它将
s2
与自身拼接起来,形成一个新的字符串。这样做的目的是为了简化旋转检测:如果s1
是s2
的旋转,那么s1
必然会出现在s2 + s2
这个字符串中。 - 最后,它调用
is_substring
方法来检查s1
是否是s2 + s2
的子串,从而判断s1
是否可以通过旋转得到s2
。 - 时间复杂度:O(n^2),其中n是输入字符串的长度(假设
s1
和s2
长度相等)。这是因为is_substring
方法的时间复杂度是O(nm),而在这里m变成了2n(因为s2
被拼接了一次),所以总体时间复杂度为O(n2n) = O(n^2)。
压缩字符串
挑战介绍
实现一个算法来压缩一个字符串。压缩的要求如下:
- 需要判断压缩能不能节省空间,仅在压缩后字符串比原字符串长度更短时进行压缩。
- 压缩的格式是将连续相同字符替换为字符+数字形式,例如
"AAABCCDDDD"
变为"A3BC2D4"
。
挑战内容
本次挑战中,你需要在 compress_str.py
文件中补充函数 compress
的空缺部分。
compress
函数接受一个参数,string
用于指定传入的字符串;compress
函数输出一个字符串。
你需要补充 compress
函数,使 compress
函数可以对传入的 string
字符串进行压缩。要求如下:
- 判断传入的字符串是否需要进行压缩,如果不需要压缩,返回原字符串;
- 如果需要压缩,返回压缩后的字符串;
- 如果传入的字符串是
None
或者空字符串,返回None
或者空字符串。
挑战要求
- 代码必须写入
compress_str.py
文件中,且不能修改示例代码中出现的类名和函数名。 - 请自行在环境主目录下新建
compress_str.py
文件,并复制示例代码到文件中完成补充。补充完整后点击「提交检测」,系统将会给出判定结果。
示例代码
class CompressString(object):
def compress(self, string):
### 补充代码 ###
pass
版权说明
内容编译自 Donne Martin 的开源项目,该项目使用 Apache 2.0 LICENSE,我们修改了部分解题和单元测试代码以适应实验楼在线环境。
参考答案:
class CompressString(object):
def compress(self, string):
if string is None or not string:
return string
result = ''
prev_char = string[0]
count = 0
for char in string:
if char == prev_char:
count += 1
else:
result += self._calc_partial_result(prev_char, count)
prev_char = char
count = 1
result += self._calc_partial_result(prev_char, count)
return result if len(result) < len(string) else string
def _calc_partial_result(self, prev_char, count):
return prev_char + (str(count) if count > 1 else '')
代码分析:
这段代码定义了一个名为CompressString
的类,其中包含一个compress
方法和一个辅助方法_calc_partial_result
。compress
方法旨在压缩输入的字符串,方法是通过统计连续字符的出现次数,并将字符与其次数合并(如果次数大于1)来实现压缩。如果压缩后的字符串长度比原字符串更长或相等,则返回原字符串;否则返回压缩后的字符串。_calc_partial_result
方法则用于构造压缩字符串的一部分。时间复杂度为O(n),其中n为输入字符串的长度,因为方法需要遍历整个字符串一次。
反转字符串中的字符
挑战介绍
实现一个算法来实现反转字符数组的功能。反转的要求如下:
- 将字符数组的字符进行反转,例如
['b', ' ', 'a', 'r']
变成['r', 'a', ' ', 'b']
。 - 将字符数组替换为反转后的数组。
挑战内容
本次挑战中,你需要在 reverse_chars.py
文件中补充函数 reverse
的空缺部分。
reverse
函数接受一个参数,chars
用于指定传入的字符数组;reverse
函数输出一个字符数组。
你需要补充 reverse
函数,使 reverse
函数可以对传入的 chars
字符数组进行反转。要求如下:
- 对于传入的字符数组,将字符数组的字符进行反转和替换,并返回替换后的字符数组;
- 如果传入的字符数组是
None
或者空字符数组,返回None
或者空字符数组。
挑战要求
- 代码必须写入
reverse_chars.py
文件中,且不能修改示例代码中出现的类名和函数名。 - 请自行在环境主目录下新建
reverse_chars.py
文件,并复制示例代码到文件中完成补充。补充完整后点击「提交检测」,系统将会给出判定结果。
示例代码
class ReverseString(object):
def reverse(self, chars):
### 补充代码 ###
pass
版权说明
内容编译自 Donne Martin 的开源项目,该项目使用 Apache 2.0 LICENSE,我们修改了部分解题和单元测试代码以适应实验楼在线环境。
参考答案:
class ReverseString(object):
def reverse(self, chars):
if chars:
size = len(chars)
for i in range(size // 2):
chars[i], chars[size - 1 - i] = \
chars[size - 1 - i], chars[i]
return chars
代码分析:
这段代码定义了一个ReverseString
类,其中包含一个reverse
方法,用于反转字符串或字符数组。逻辑上,它首先检查传入的chars
是否为空,如果不为空,则计算其长度。接着,使用一个循环,循环次数为字符串长度的一半(因为只需要交换前半部分和后半部分的字符),在每次循环中,通过元组解包的方式交换对称位置的字符。最终,返回反转后的字符数组。时间复杂度为O(n/2),即O(n),其中n是字符数组的长度,因为需要遍历并交换数组中的一半元素。空间复杂度为O(1),因为没有使用额外的空间来存储数据。
找到给定字符串中的不同字符
挑战介绍
在不考虑字符排列的条件下,对于相差只有一个字符的两个字符串,实现一个算法来识别相差的那个字符。要求如下:
- 当传入的字符串为
'aad'
和'ad'
时,结果为'a'
。 - 当传入的字符串为
'aaabccdd'
和'abdcacade'
时,结果为'e'
。
挑战内容
本次挑战中,你需要在 diff.py
文件中补充函数 find_diff
的空缺部分。
find_diff
函数接受两个参数,str1
,str2
用于指定传入的相差只有一个字符的两个字符串;find_diff
函数输出只有一个字符的字符串。
你需要补充 find_diff
函数,使 find_diff
函数可以识别传入的 str1
,str2
之间相差的那个字符。要求如下:
- 对于传入的两个字符串,返回它们之间相差的那个字符;
- 如果传入的字符串有
None
,需要使用raise
语句显示TypeError
。
挑战要求
- 代码必须写入
diff.py
文件中,且不能修改示例代码中出现的类名和函数名。 - 请自行在环境主目录下新建
diff.py
文件,并复制示例代码到文件中完成补充。补充完整后点击「提交检测」,系统将会给出判定结果。
示例代码
class Solution(object):
def find_diff(self, str1, str2):
### 补充代码 ###
pass
版权说明
内容编译自 Donne Martin 的开源项目,该项目使用 Apache 2.0 LICENSE,我们修改了部分解题和单元测试代码以适应实验楼在线环境。
参考答案:
class Solution(object):
def find_diff(self, str1, str2):
if str1 is None or str2 is None:
raise TypeError('str1 or str2 cannot be None')
result = 0
for char in str1:
result ^= ord(char)
for char in str2:
result ^= ord(char)
return chr(result)
代码分析:
这段代码定义了一个名为 Solution
的类,其中包含一个方法 find_diff
,该方法的目的是找出两个字符串 str1
和 str2
之间的单个字符差异。方法首先检查输入字符串是否为 None
,如果是,则抛出一个 TypeError
。接着,它使用异或操作来计算两个字符串中字符的ASCII值的差异。
逻辑上,该方法通过遍历 str1
和 str2
中的每个字符,并对每个字符的ASCII值进行异或操作,最终得到一个结果值。由于异或操作的性质,如果两个字符串完全相同,那么最终的异或结果将为0。但是,如果两个字符串中仅有一个字符不同,那么最终的异或结果将是这个不同字符的ASCII值。最后,该方法使用 chr
函数将结果值转换回字符,并返回这个字符。
时间复杂度方面,该方法需要遍历 str1
和 str2
中的所有字符,因此其时间复杂度为 O(n+m),其中 n 是 str1
的长度,m 是 str2
的长度。这意味着,随着字符串长度的增加,执行时间将线性增长。
查找两个总和为特定值的索引
挑战介绍
给定一个数组,找到两个总和为特定值的索引。
- 例如给定数组
[1, 2, 3, -2, 5, 7]
,给定总和7
,则返回索引[1, 4]
。
挑战内容
本次挑战中,你需要在 sum.py
文件中补充函数 two_sum
的空缺部分。
two_sum
函数接受两个参数,nums
用于指定传入的数组,val
用于指定和的值;two_sum
函数输出含两个索引的数组,或者TypeError
、ValueError
。
你需要补充 two_sum
函数,使 two_sum
函数可以找到数组 nums
中两个总和为 val
的值的索引。要求如下:
- 对于传入的数组
nums
,返回总和为val
的两个值的索引; - 如果数组中没有和为目标值的元素,则返回
None
。 - 如果传入的数组
nums
或者目标值val
为None
,需要使用raise
语句显示TypeError
。 - 如果传入的数组为空数组,需要使用
raise
语句显示ValueError
。
挑战要求
- 代码必须写入
sum.py
文件中,且不能修改示例代码中出现的类名和函数名。 - 请自行在环境主目录下新建
sum.py
文件,并复制示例代码到文件中完成补充。补充完整后点击「提交检测」,系统将会给出判定结果。
示例代码
class Solution(object):
def two_sum(self, nums, val):
### 补充代码 ###
pass
版权说明
内容编译自 Donne Martin 的开源项目,该项目使用 Apache 2.0 LICENSE,我们修改了部分解题和单元测试代码以适应实验楼在线环境。
参考答案:
class Solution(object):
def two_sum(self, nums, val):
if nums is None or val is None:
raise TypeError('nums or target cannot be None')
if not nums:
raise ValueError('nums cannot be empty')
cache = {}
for index, num in enumerate(nums):
cache_val = val - num
if num in cache:
return [cache[num], index]
else:
cache[cache_val] = index
return None
代码分析:
这段代码是一个解决“两数之和”问题的Python类方法。方法的目的是在给定的整数列表nums
中找到两个数,使它们的和等于val
,并返回这两个数的索引。方法首先检查输入的有效性,然后通过遍历nums
列表并使用一个字典cache
来存储之前遍历过的数和它们的索引。在遍历过程中,它计算目标值val
与当前数的差值,并检查这个差值是否已经在cache
中。如果在,则返回差值的索引和当前数的索引;如果不在,则将当前数与它的索引存入cache
中以备后续检查。这种方法的时间复杂度是O(n),因为它只需要遍历列表一次。空间复杂度也是O(n),因为在最坏的情况下,cache
字典将存储列表中的每个元素及其索引。整体而言,这是一个高效且巧妙的解决方案。
Fizz Buzz 经典问题
挑战介绍
给定一个整数 num
,从 1
到 num
按照下面的规则返回每个数:
- 如果这个数被
3
整除,返回'Fizz'
。 - 如果这个数被
5
整除,返回'Buzz'
。 - 如果这个数能同时被
3
和5
整除,返回'FizzBuzz'
。 - 如果这个数既不能被
3
也不能被5
整除,返回这个数字的字符串格式。
挑战内容
本次挑战中,你需要在 fizzbuzz.py
文件中补充函数 fizz_buzz
的空缺部分。
fizz_buzz
函数接受一个参数,num
用于指定传入的整数;fizz_buzz
函数输出一个数组。
你需要补充 fizz_buzz
函数,使 fizz_buzz
函数可以识别从 1
到 num
中能被 3
或 5
整除的数。要求如下:
- 对于传入的整数
num
,返回长度为num
的数组,数组的每个值由Fizz Buzz
的规则构成; - 如果传入的数为
None
,需要使用raise
语句显示TypeError
。 - 如果传入的整数小于
1
,需要使用raise
语句显示ValueError
。
挑战要求
- 代码必须写入
fizzbuzz.py
文件中,且不能修改示例代码中出现的类名和函数名。 - 请自行在环境主目录下新建
fizzbuzz.py
文件,并复制示例代码到文件中完成补充。补充完整后点击「提交检测」,系统将会给出判定结果。
示例代码
class Solution(object):
def fizz_buzz(self, num):
### 补充代码 ###
pass
版权说明
内容编译自 Donne Martin 的开源项目,该项目使用 Apache 2.0 LICENSE,我们修改了部分解题和单元测试代码以适应实验楼在线环境。
参考答案:
class Solution(object):
def fizz_buzz(self, num):
if num is None:
raise TypeError('num cannot be None')
if num < 1:
raise ValueError('num cannot be less than one')
results = []
for i in range(1, num + 1):
if i % 3 == 0 and i % 5 == 0:
results.append('FizzBuzz')
elif i % 3 == 0:
results.append('Fizz')
elif i % 5 == 0:
results.append('Buzz')
else:
results.append(str(i))
return results
代码分析:
这段代码定义了一个fizz_buzz
方法,用于解决经典的"FizzBuzz"问题。方法接收一个参数num
,代表要生成的"FizzBuzz"序列的长度。首先,代码检查num
是否为None
或小于1,如果是,则抛出相应的异常。接下来,方法初始化一个空列表results
来存储结果。然后,它使用一个循环从1遍历到num
,对于每个数字,根据是否能被3或5整除,将对应的字符('FizzBuzz','Fizz','Buzz'或数字本身的字符串形式)添加到results
列表中。最后,返回填充好的results
列表。这个方法的时间复杂度是O(n),因为它需要遍历从1到num
的每个数字一次,其中n是num
的值。空间复杂度也是O(n),因为结果列表results
的大小与num
成正比。