python百题大冲关(1-6)

Posted 胖虎是只mao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python百题大冲关(1-6)相关的知识,希望对你有一定的参考价值。

参考答案仓库:https://github.com/Shallow22/python-100

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

挑战内容

本次挑战中,你需要在 unique_chars.py 文件中补充函数 has_unique_chars 的空缺部分。

has_unique_chars 函数接受一个参数,string 用于指定传入的字符串;
has_unique_chars 函数输出一个布尔值,即 True 或者 False。
你需要补充 has_unique_chars 函数,使其可以识别传入的 string 字符串的字符是否是唯一的,即有没有重复的字符。要求如下:

如果传入字符串的字符是唯一的,则返回 True;
如果传入字符串的字符是有重复的,则返回 False;
如果传入的字符串为 None,也返回 False。
我的代码:

class UniqueChars(object):
    def has_unique_chars(self, string):
        if string is None:
            return False
        else:
            if len(string) > len(set(string)):
                return False
            else:
                return True

官方代码:

class UniqueChars(object):

    def has_unique_chars(self, string):
        if string is None:
            return False
        return len(set(string)) == len(string)

2. 确定字符串是否是另一个的排列

挑战介绍

实现一个算法来识别一个字符串 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。

class Permutations(object):

    def is_permutation(self, str1, str2):
        if str1 is None or str2 is None:
            return False
        return sorted(str1) == sorted(str2)
        # 判断排序后是否一样

3. 确定字符串是否是另一个的旋转

挑战介绍

实现一个算法来识别一个字符串 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
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)
        # s2 + s2 可以让s1 永远都在s2中,因为是旋转

4. 压缩字符串

实现一个算法来压缩一个字符串。压缩的要求如下:

需要判断压缩能不能节省空间,仅在压缩后字符串比原字符串长度更短时进行压缩。
压缩的格式是将连续相同字符替换为字符+数字形式,例如 “AAABCCDDDD” 变为 “A3BC2D4”。

要求如下:

  • 判断传入的字符串是否需要进行压缩,如果不需要压缩,返回原字符串;
  • 如果需要压缩,返回压缩后的字符串;
  • 如果传入的字符串是 None 或者空字符串,返回 None 或者空字符串。
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 '')

5. 反转字符串中的字符

实现一个算法来实现反转字符数组的功能。反转的要求如下:

将字符数组的字符进行反转,例如 [‘b’, ’ ', ‘a’, ‘r’] 变成 [‘r’, ‘a’, ’ ', ‘b’]。
将字符数组替换为反转后的数组。

要求如下:

  • 对于传入的字符数组,将字符数组的字符进行反转和替换,并返回替换后的字符数组;
  • 如果传入的字符数组是 None 或者空字符数组,返回 None 或者空字符数组。
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
~                     

更简单的方法

    # def reverse(self, chars):
    #     if chars:
    #         list_str = list(chars)
    #         list_str.reverse()
    #         str1 = ''.join(list_str)
    #         return str1
    #     else:
    #         return None
    def reverse(self, chars):
        if chars:
            chars.reverse()
            return chars
        else:
            return None

六、找到给定字符串中的不同字符

在不考虑字符排列的条件下,对于相差只有一个字符的两个字符串,实现一个算法来识别相差的那个字符。要求如下:

  • 当传入的字符串为 ‘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。

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)
s = Solution()
print(s.find_diff('zhang','zha'))
'''
 ^ 异或,异或就是按位相或,不一样的生成一个新集合
 对于两个集合,a ^= b计算集合a和b(两个集合中正好有一个集合中的所有元素
 a ^= b实际上相当于a = a^b
 
a = 2,5,8
b = 3,5,9
a = a^b
a
Out[7]: 2, 3, 8, 9
c = a^b
c
Out[9]: 2, 5, 8
'''

chr()函数
格式:Chr(<数值表达式>)
说明:函数返回值类型为String,其数值表达式值取值范围为0~255。
以下是 chr() 方法的语法:

chr(i)

i – 可以是10进制也可以是16进制的形式的数字。
返回值是当前整数对应的 ASCII 字符。

for i in range(97,123):
    print(chr(i),end='')
abcdefghijklmnopqrstuvwxyz

for i in range(65,91):
    print(chr(i),end='')
ABCDEFGHIJKLMNOPQRSTUVWXYZ

ord函数
格式:ord(“字符串“)
说明: 函数返回值类型为 int类型
例如 : ord(“0”),结果显示:48

ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。
语法
以下是 ord() 方法的语法:

ord(c)

c – 字符。
返回值是对应的十进制整数。

ord('a')
Out[23]: 97
ord('b')
Out[24]: 98
ord('c')
Out[25]: 99
ord('A')
Out[26]: 65
ord('@')
Out[27]: 64
ord('(')
Out[28]: 40

以上是关于python百题大冲关(1-6)的主要内容,如果未能解决你的问题,请参考以下文章

14Pandas 百题大冲关

1万9千多单词大冲关含真人读音ACCESS数据库

python-趣味百题

python-趣味百题4

python-趣味百题3

Python 趣味百题