python:基础入门练习086 - 100

# -*- coding: utf-8 -*-
# 086: 面试题 01.07. 旋转矩阵
# 给你一幅由 N × N矩阵表示的图像,其中每个像素的大小为4字节。请你设计一种算法,将图像旋转90度。
# 示例 1:
# 给定 matrix =
# [
#   [1,2,3],
#   [4,5,6],
#   [7,8,9]
# ],
#
# 原地旋转输入矩阵,使其变为:
# [
#   [7,4,1],
#   [8,5,2],
#   [9,6,3]
# ]


class Solution086:
    def rotate(self, matrix: list[list[int]]) -> None:
        all = [j for i in matrix for j in i]
        lend = len(matrix[0])
        a = []
        for i in range(lend):
            init_a = all[i::lend][::-1]
            a.append(init_a)
        matrix[:] = a


s086 = Solution086()
matrix = [
    [5, 1, 9, 11],
    [2, 4, 8, 10],
    [13, 3, 6, 7],
    [15, 14, 12, 16]
]
s086.rotate(matrix)
print(matrix)  # [[15, 13, 2, 5], [14, 3, 4, 1], [12, 6, 8, 9], [16, 7, 10, 11]]


# 087: 实现 strStr()
# 实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个
# 位置(下标从 0 开始)。如果不存在,则返回-1 。
# 示例 1:
# 输入:haystack = "hello", needle = "ll"
# 输出:2
#
# 示例 2:
# 输入:haystack = "aaaaa", needle = "bba"
# 输出:-1
#
# 示例 3:
# 输入:haystack = "", needle = ""
# 输出:0


class Solution087:
    def strStr(self, haystack: str, needle: str) -> int:
        return haystack.find(needle) if needle in haystack else -1


s087 = Solution087()
r087 = s087.strStr("hello", "he")
print(r087)  # 0


# 088: 翻转字符串里的单词
# 给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
# 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
# 请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
# 示例 1:
# 输入:s = "the sky is blue"
# 输出:"blue is sky the"
#
# 示例 2:
# 输入:s = "  hello world  "
# 输出:"world hello"
# 解释:输入字符串可以在前面或者后面包含多余的空格,但是翻转后的字符不能包括。


class Solution088:
    def reverseWords(self, s: str) -> str:
        words = s.split(" ")
        words = [i for i in words[::-1] if i]
        return " ".join(words)


s088 = Solution088()
r088 = s088.reverseWords("hello world")
print(r088)  # world hello


# 089: 最大连续 1 的个数
# 给定一个二进制数组, 计算其中最大连续 1 的个数。
# 示例:
# 输入:[1,1,0,1,1,1]
# 输出:3
# 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.


class Solution089:
    def findMaxConsecutiveOnes(self, nums: list[int]) -> int:
        s = "".join([str(i) for i in nums])
        words = s.split("0")
        words.sort()
        return len(words[-1])


s089 = Solution089()
r089 = s089.findMaxConsecutiveOnes([1, 0, 1, 1, 0, 1, 1, 1, 0])
print(r089)  # 3


# 090: 各位相加
# 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
# 示例:
# 输入: 38
# 输出: 2
# 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。


class Solution090:
    def addDigits(self, num: int) -> int:
        while True:
            num = sum([int(i) for i in str(num)])
            if num < 10:
                break
        return num


s090 = Solution090()
r090 = s090.addDigits(88)
print(r090)  # 7: 8+8 > 16 > 1+6 > 7


# 091: 多数元素
# 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
# 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
# 示例 1:
# 输入:[3,2,3]
# 输出:3
#
# 示例 2:
# 输入:[2,2,1,1,1,2,2]
# 输出:2


class Solution091:
    def majorityElement(self, nums: list[int]) -> int:
        nums.sort()
        return nums[len(nums) // 2]


s091 = Solution091()
r091 = s091.majorityElement([1, 2, 2, 3, 3, 2, 1])
print(r091)  # 2


# 092: 十-二进制数的最少数目
# 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 。
# 例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是。
# 给你一个表示十进制整数的字符串 n ,返回和为 n 的 十-二进制数 的最少数目。
# 示例 1:
# 输入:n = "32"
# 输出:3
# 解释:10 + 11 + 11 = 32
#
# 示例 2:
# 输入:n = "82734"
# 输出:8
#
# 示例 3:
# 输入:n = "27346209830709182346"
# 输出:9


class Solution092:
    def minPartitions(self, n: str) -> int:
        # 本质是求各位位上出现的最大数值。
        return int(max(n))


s092 = Solution092()
r092 = s092.minPartitions("3141592653")
print(r092)  # 9


# 093: 反转字符串中的单词 III
# 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
# 示例:
# 输入:"Let's take LeetCode contest"
# 输出:"s'teL ekat edoCteeL tsetnoc"


class Solution093:
    def reverseWords(self, s: str) -> str:
        words = s.split(" ")
        words = [i[::-1] for i in words]
        return " ".join(words)


s093 = Solution093()
r093 = s093.reverseWords("s'tI a .tac")
print(r093)  # It's a cat.


# 094: 合并两个有序数组
# 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
# 示例 1:
# 输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
# 输出:[1,2,2,3,5,6]
# 解释:需要合并 [1,2,3] 和 [2,5,6] 。
# 合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
#
# 示例 2:
# 输入:nums1 = [1], m = 1, nums2 = [], n = 0
# 输出:[1]
# 解释:需要合并 [1] 和 [] 。
# 合并结果是 [1] 。
#
# 示例 3:
# 输入:nums1 = [0], m = 0, nums2 = [1], n = 1
# 输出:[1]
# 解释:需要合并的数组是 [] 和 [1] 。
# 合并结果是 [1] 。
# 注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。


class Solution094:
    def merge(self, nums1: list[int], m: int, nums2: list[int], n: int) -> None:
        nums1[:] = nums1[:m] + nums2[:n]
        nums1.sort()


s094 = Solution094()
nums094 = [1, 1, 2, 3, 4, 5, 5, 6]
s094.merge(nums1=nums094, m=3, nums2=[2, 3, 3, 4, 5], n=3)
print(nums094)  # [1, 1, 2, 2, 3, 3]


# 095: 2 的幂
# 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
# 如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
# 示例 1:
# 输入:n = 1
# 输出:true
# 解释:20 = 1
#
# 示例 2:
# 输入:n = 16
# 输出:true
# 解释:24 = 16
#
# 示例 3:
# 输入:n = 3
# 输出:false


class Solution095:
    def isPowerOfTwo(self, n: int) -> bool:
        if n == 0:
            return False
        if n in (1, 2):
            return True

        while True:
            n = n / 2
            if n == 2:
                r = True
                break
            if n != int(n):
                r = False
                break
        return r


s095 = Solution095()
r095 = s095.isPowerOfTwo(36)
print(r095)  # False


# 096: 数组中的第K个最大元素
# 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
# 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
# 示例 1:
# 输入: [3,2,1,5,6,4] 和 k = 2
# 输出: 5
#
# 示例 2:
# 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
# 输出: 4


class Solution096:
    def findKthLargest(self, nums: list[int], k: int) -> int:
        nums.sort()
        return nums[-k]


s096 = Solution096()
r096 = s096.findKthLargest([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9], 3)
print(r096)  # 8


# 097: 整数反转
# 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
# 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。
# 假设环境不允许存储 64 位整数(有符号或无符号)。
# 示例 1:
# 输入:x = 123
# 输出:321
#
# 示例 2:
# 输入:x = -123
# 输出:-321
#
# 示例 3:
# 输入:x = 120
# 输出:21
#
# 示例 4:
# 输入:x = 0
# 输出:0


class Solution097:
    def reverse(self, x: int) -> int:
        if abs(x) < 10:
            return x
        list1 = [i for i in str(x)]
        s = "+"
        if list1[0] == "-":
            s = list1[0]
            list1[:] = list1[1:]
        while True:
            if list1[-1] == "0":
                list1[:] = list1[:-1]
            else:
                break
        r = int(s + "".join(list1[::-1]))
        if abs(r) > (2 ** 31 - 1):
            return 0
        return int(s + "".join(list1[::-1]))


s097 = Solution097()
r097 = s097.reverse(-314159)
print(r097)  # -951413


# 098: 阶乘后的零
# 给定一个整数 n ,返回 n! 结果中尾随零的数量。
# 提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1
# 示例 1:
# 输入:n = 3
# 输出:0
# 解释:3! = 6 ,不含尾随 0
#
# 示例 2:
# 输入:n = 5
# 输出:1
# 解释:5! = 120 ,有一个尾随 0
#
# 示例 3:
# 输入:n = 0
# 输出:0


class Solution098:
    def trailingZeroes(self, n: int) -> int:
        if n in (0, 1):
            return 0
        s = 1
        while True:
            s *= n
            n -= 1
            if n == 1:
                break
        return len(str(s)) - len(str(int(str(s)[::-1])))


s098 = Solution098()
r098 = s098.trailingZeroes(68)
print(r098)  # 15


# 099: 寻找重复数
# 给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。
# 假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。
# 示例 1:
# 输入:nums = [1,3,4,2,2]
# 输出:2
# 示例 2:
# 输入:nums = [3,1,3,4,2]
# 输出:3
#
# 示例 3:
# 输入:nums = [1,1]
# 输出:1
#
# 示例 4:
# 输入:nums = [1,1,2]
# 输出:1


class Solution099:
    def findDuplicate(self, nums: list[int]) -> int:
        set1 = set()
        # 不在集合内则加入集合
        for num in nums:
            if num not in set1:
                set1.add(num)
            else:
                return num


s099 = Solution099()
r099 = s099.findDuplicate([3, 1, 4, 1, 5, 9, 2, 6, 5])
print(r099)  # 1


# 100: 字典序排数
# 给你一个整数
# n ,按字典序返回范围[1, n]
# 内所有整数。
# 你必须设计一个时间复杂度为
# O(n)
# 且使用
# O(1)
# 额外空间的算法。
# 示例
# 1:
# 输入:n = 13
# 输出:[1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9]
#
# 示例
# 2:
# 输入:n = 2
# 输出:[1, 2]


class Solution100:
    def lexicalOrder(self, n: int) -> list[int]:
        return [int(i) for i in sorted({str(i): 1 for i in range(1, n + 1)}.keys())]


s100 = Solution100()
r100 = s100.lexicalOrder(22)
print(r100)  # [1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 3, 4, 5, 6, 7, 8, 9]

微信公众号:玩转测试开发
欢迎关注,共同进步,谢谢!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容