Python 百题(实战快速掌握语法)_1(数组与字符串)

确定字符串是否包含唯一字符

挑战介绍

实现一个算法来识别一个字符串的字符是否是唯一的。

挑战内容

本次挑战中,你需要在 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 函数接受两个参数,str1str2 用于指定传入的两个字符串;
  • 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 函数接受两个参数,s1s2 用于指定传入的两个字符串;

  • is_substring 函数用于判断传入的一个字符串是否是另一个的子字符串,它需要返回一个布尔值。

  • is_rotation 函数接受两个参数,s1s2 用于指定传入的两个字符串;

  • 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_substringis_rotation

is_substring方法
  • 这个方法检查字符串s1是否是字符串s2的子串。
  • 它使用Python的in操作符来判断,这是一个简洁而高效的方法。
  • 时间复杂度:O(n*m),其中n是s1的长度,m是s2的长度。因为in操作在最坏的情况下需要遍历整个s2字符串来查找s1
is_rotation方法
  • 此方法用于判断字符串s1是否可以通过循环移位(旋转)得到字符串s2
  • 首先,它检查s1s2是否为None,以及它们的长度是否相等。如果不满足这些条件,方法直接返回False
  • 接下来,它将s2与自身拼接起来,形成一个新的字符串。这样做的目的是为了简化旋转检测:如果s1s2的旋转,那么s1必然会出现在s2 + s2这个字符串中。
  • 最后,它调用is_substring方法来检查s1是否是 s2 + s2的子串,从而判断s1是否可以通过旋转得到s2
  • 时间复杂度:O(n^2),其中n是输入字符串的长度(假设s1s2长度相等)。这是因为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_resultcompress方法旨在压缩输入的字符串,方法是通过统计连续字符的出现次数,并将字符与其次数合并(如果次数大于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 函数接受两个参数,str1str2 用于指定传入的相差只有一个字符的两个字符串;
  • find_diff 函数输出只有一个字符的字符串。

你需要补充 find_diff 函数,使 find_diff 函数可以识别传入的 str1str2 之间相差的那个字符。要求如下:

  • 对于传入的两个字符串,返回它们之间相差的那个字符;
  • 如果传入的字符串有 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成正比。

  • 57
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值