diff --git a/.idea/misc.xml b/.idea/misc.xml index 2cf4d90..ffcdd10 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -13,7 +13,5 @@ - - - + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 748e62d..b0f566e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -37,6 +37,7 @@ + + + + + + + + @@ -143,6 +212,47 @@ + + + + @@ -171,6 +281,24 @@ + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/com/libin/yfl/67.py b/src/main/com/libin/yfl/67.py new file mode 100644 index 0000000..7dfe400 --- /dev/null +++ b/src/main/com/libin/yfl/67.py @@ -0,0 +1,41 @@ +''' +944. 删列造序 +给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等。 +你需要选出一组要删掉的列 D,对 A 执行删除操作,使 A 中剩余的每一列都是 非降序 排列的,然后请你返回 D.length 的最小可能值。 +删除 操作的定义是:选出一组要删掉的列,删去 A 中对应列中的所有字符,形式上,第 n 列为 [A[0][n], A[1][n], ..., A[A.length-1][n]])。(可以参见 删除操作范例) + +示例 1: + +输入:["cba", "daf", "ghi"] +输出:1 +解释: +当选择 D = {1},删除后 A 的列为:["c","d","g"] 和 ["a","f","i"],均为非降序排列。 +若选择 D = {},那么 A 的列 ["b","a","h"] 就不是非降序排列了。 +示例 2: + +输入:["a", "b"] +输出:0 +解释:D = {} +示例 3: + +输入:["zyx", "wvu", "tsr"] +输出:3 +解释:D = {0, 1, 2} +''' + + +class Solution: + def minDeletionSize(self, A: List[str]) -> int: + list1 = [] + for i in range(len(A[0])): + linshi = [] + for j in range(len(A)): + linshi.append(A[j][i]) + list1.append(linshi) + count = 0 + for each in list1: + linshi = [x for x in each] + each.sort() + if linshi != each: + count += 1 + return count diff --git a/src/main/com/libin/yfl/68.py b/src/main/com/libin/yfl/68.py new file mode 100644 index 0000000..77ce74f --- /dev/null +++ b/src/main/com/libin/yfl/68.py @@ -0,0 +1,52 @@ +''' +984. 不含 AAA 或 BBB 的字符串 +给定两个整数 A 和 B,返回任意字符串 S,要求满足: + +S 的长度为 A + B,且正好包含 A 个 'a' 字母与 B 个 'b' 字母; +子串 'aaa' 没有出现在 S 中; +子串 'bbb' 没有出现在 S 中。 + + +示例 1: + +输入:A = 1, B = 2 +输出:"abb" +解释:"abb", "bab" 和 "bba" 都是正确答案。 +示例 2: + +输入:A = 4, B = 1 +输出:"aabaa" +''' + + +class Solution: + def strWithout3a3b(self, A: int, B: int) -> str: + if A == B: + return "ab" * A + + ans = "" + la = A + lb = B + while la > 0 and lb > 0: + if la > lb: + ans += "aab" + la -= 2 + lb -= 1 + elif la < lb: + ans += "bba" + la -= 1 + lb -= 2 + else: + if A > B: + ans += "ab" * la + else: + ans += "ba" * la + la = 0 + lb = 0 + + if A > B: + ans += "a" * la + "b" * lb + else: + ans += "b" * lb + "a" * la + + return ans diff --git a/src/main/com/libin/yfl/69.py b/src/main/com/libin/yfl/69.py new file mode 100644 index 0000000..685596d --- /dev/null +++ b/src/main/com/libin/yfl/69.py @@ -0,0 +1,24 @@ +''' +874. 模拟行走机器人 +机器人在一个无限大小的网格上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令: +-2:向左转 90 度 +-1:向右转 90 度 +1 <= x <= 9:向前移动 x 个单位长度 +在网格上有一些格子被视为障碍物。 + +第 i 个障碍物位于网格点 (obstacles[i][0], obstacles[i][1]) +机器人无法走到障碍物上,它将会停留在障碍物的前一个网格方块上,但仍然可以继续该路线的其余部分。 +返回从原点到机器人所有经过的路径点(坐标为整数)的最大欧式距离的平方。 +示例 1: +输入: commands = [4,-1,3], obstacles = [] +输出: 25 +解释: 机器人将会到达 (3, 4) +示例 2: + +输入: commands = [4,-1,4,-2,4], obstacles = [[2,4]] +输出: 65 +解释: 机器人在左转走到 (1, 8) 之前将被困在 (1, 4) 处 +''' + +class Solution: + def robotSim(self, commands: List[int], obstacles: List[List[int]]) -> int: \ No newline at end of file diff --git a/src/main/com/libin/yfl/70.py b/src/main/com/libin/yfl/70.py new file mode 100644 index 0000000..3382ebe --- /dev/null +++ b/src/main/com/libin/yfl/70.py @@ -0,0 +1,36 @@ +# coding:utf-8 +''' + +9. 回文数 +判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 + +示例 1: + +输入: 121 +输出: true +示例 2: + +输入: -121 +输出: false +解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 +示例 3: + +输入: 10 +输出: false +解释: 从右向左读, 为 01 。因此它不是一个回文数。 +''' + + +def isPalindrom(x): + if x < 0: + return False + list1 = list(str(x)) + list2 = [each for each in list1] + list1.reverse() + if list1 == list2: + return True + else: + return False + + +print(isPalindrom(121)) diff --git a/src/main/com/libin/yfl/71.py b/src/main/com/libin/yfl/71.py new file mode 100644 index 0000000..78bc07d --- /dev/null +++ b/src/main/com/libin/yfl/71.py @@ -0,0 +1,51 @@ +# coding:utf-8 +''' +824. 山羊拉丁文 +给定一个由空格分割单词的句子 S。每个单词只包含大写或小写字母。 + +我们要将句子转换为 “Goat Latin”(一种类似于 猪拉丁文 - Pig Latin 的虚构语言)。 + +山羊拉丁文的规则如下: + +如果单词以元音开头(a, e, i, o, u),在单词后添加"ma"。 +例如,单词"apple"变为"applema"。 + +如果单词以辅音字母开头(即非元音字母),移除第一个字符并将它放到末尾,之后再添加"ma"。 +例如,单词"goat"变为"oatgma"。 + +根据单词在句子中的索引,在单词最后添加与索引相同数量的字母'a',索引从1开始。 +例如,在第一个单词后添加"a",在第二个单词后添加"aa",以此类推。 +返回将 S 转换为山羊拉丁文后的句子。 + +示例 1: + +输入: "I speak Goat Latin" +输出: "Imaa peaksmaaa oatGmaaaa atinLmaaaaa" +示例 2: + +输入: "The quick brown fox jumped over the lazy dog" +输出: "heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa" +''' + + +def toGoatLatin(s): + list1 = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'] + list_s = s.split() + for i in range(len(list_s)): + if list_s[i][0] in list1: + str1 = '' + for j in range(len(list_s[i])): + str1 = str1 + list_s[i][j] + str1 = str1 + 'ma' + 'a' * (i + 1) + list_s[i] = str1 + else: + str1 = '' + for j in range(1, len(list_s[i])): + str1 = str1 + list_s[i][j] + str1 = str1 + list_s[i][0] + 'ma' + 'a' * (i + 1) + list_s[i] = str1 + return ' '.join(list_s) + + +s = "The quick brown fox jumped over the lazy dog" +print(toGoatLatin(s)) diff --git a/src/main/com/libin/yfl/72.py b/src/main/com/libin/yfl/72.py new file mode 100644 index 0000000..09595cd --- /dev/null +++ b/src/main/com/libin/yfl/72.py @@ -0,0 +1,39 @@ +# coding:utf-8 +''' +849. 到最近的人的最大距离 +在一排座位( seats)中,1 代表有人坐在座位上,0 代表座位上是空的。 +至少有一个空座位,且至少有一人坐在座位上。 +亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。 +返回他到离他最近的人的最大距离。 +示例 1: +输入:[1,0,0,0,1,0,1] +输出:2 +解释: +如果亚历克斯坐在第二个空位(seats[2])上,他到离他最近的人的距离为 2 。 +如果亚历克斯坐在其它任何一个空位上,他到离他最近的人的距离为 1 。 +因此,他到离他最近的人的最大距离是 2 。 +示例 2: +输入:[1,0,0,0] +输出:3 +解释: +如果亚历克斯坐在最后一个座位上,他离最近的人有 3 个座位远。 +这是可能的最大距离,所以答案是 3 。 +''' + + +class Solution: + def maxDistToClosest(self, seats: List[int]) -> int: + seats.insert(0, 1) + seats.append(1) + start = 0 + res = 0 + for i in range(1, len(seats)): + if seats[i] == 0 and seats[i - 1] == 1: + start = i + if seats[i] == 1 and seats[i - 1] == 0: + gap = i - start + if start == 1 or i == len(seats) - 1: + res = max(res, gap) + else: + res = max((gap - 1) // 2 + 1, res) + return res diff --git a/src/main/com/libin/yfl/73.py b/src/main/com/libin/yfl/73.py new file mode 100644 index 0000000..9554650 --- /dev/null +++ b/src/main/com/libin/yfl/73.py @@ -0,0 +1,30 @@ +# coding:utf-8 +''' +392. 判断子序列 +给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 +你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。 +字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 +示例 1: +s = "abc", t = "ahbgdc" +返回 true. +示例 2: +s = "axc", t = "ahbgdc" +返回 false. +后续挑战 : +如果有大量输入的 S,称作S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码? +''' + +class Solution: + def isSubsequence(self, s: str, t: str) -> bool: + start = 0 + tag = 0 + for i in range(len(s)): + for k in range(start, len(t)): + if s[i] == t[k]: + tag += 1 + start = k + 1 + break + if tag == len(s): + return True + else: + return False diff --git a/src/main/com/libin/yfl/74.py b/src/main/com/libin/yfl/74.py new file mode 100644 index 0000000..0d90ed8 --- /dev/null +++ b/src/main/com/libin/yfl/74.py @@ -0,0 +1,36 @@ +# coding:utf8 +''' +326. 3的幂 +给定一个整数,写一个函数来判断它是否是 3 的幂次方。 +示例 1: + +输入: 27 +输出: true +示例 2: + +输入: 0 +输出: false +示例 3: + +输入: 9 +输出: true +示例 4: + +输入: 45 +输出: false +进阶: +你能不使用循环或者递归来完成本题吗? 可以考虑对数公时 +''' + +class Solution: + def isPowerOfThree(self, n: int) -> bool: + while True: + if n == 0: + return False + if n % 3 == 0: + n = n // 3 + continue + elif n == 1: + return True + else: + return False diff --git a/src/main/com/libin/yfl/75.py b/src/main/com/libin/yfl/75.py new file mode 100644 index 0000000..606debb --- /dev/null +++ b/src/main/com/libin/yfl/75.py @@ -0,0 +1,37 @@ +# coding:utf-8 +''' +35. 搜索插入位置 +给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 + +你可以假设数组中无重复元素。 + +示例 1: + +输入: [1,3,5,6], 5 +输出: 2 +示例 2: + +输入: [1,3,5,6], 2 +输出: 1 +示例 3: + +输入: [1,3,5,6], 7 +输出: 4 +示例 4: + +输入: [1,3,5,6], 0 +输出: 0 +''' + + +class Solution: + def searchInsert(self, nums: List[int], target: int) -> int: + if target <= nums[0]: + return 0 + if target > nums[-1]: + return len(nums) + if target == nums: + return len(nums) - 1 + for i in range(len(nums) - 1): + if target > nums[i] and target <= nums[i + 1]: + return i + 1 diff --git a/src/main/com/libin/yfl/76.py b/src/main/com/libin/yfl/76.py new file mode 100644 index 0000000..75c71fc --- /dev/null +++ b/src/main/com/libin/yfl/76.py @@ -0,0 +1,56 @@ +# coding:utf-8 +''' +97. 交错字符串 +给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。 + +示例 1: + +输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac" +输出: true +示例 2: + +输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc" +输出: false +''' + + +def isInterleave(s1: str, s2: str, s3: str) -> bool: + tag = 0 + str1 = '' + if not s1: + return False + if not s2: + return False + if not s3: + return False + for i in range(len(s1)): + flag = 0 + for j in range(tag, len(s3)): + if s3[j] == s1[i]: + tag = j + 1 + flag = 1 + break + else: + str1 = str1 + s3[j] + if flag == 0: + return False + if tag < len(s3) - 1: + str1 = str1 + s3[tag:] + tag = 0 + print(str1) + for i in range(len(s2)): + flag = 0 + for j in range(tag, len(s3)): + if s3[j] == s2[i]: + tag = j + 1 + flag = 1 + break + if flag == 0: + return False + return True + + +s1 = "aabcc" +s2 = "dbbca" +s3 = "aadbbcbcac" +print(isInterleave(s1, s2, s3)) diff --git a/src/main/com/libin/yfl/77.py b/src/main/com/libin/yfl/77.py new file mode 100644 index 0000000..52d48ed --- /dev/null +++ b/src/main/com/libin/yfl/77.py @@ -0,0 +1,42 @@ +# coding:utf-8 +''' +690. 员工的重要性 +给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度 和 直系下属的id。 + +比如,员工1是员工2的领导,员工2是员工3的领导。他们相应的重要度为15, 10, 5。那么员工1的数据结构是[1, 15, [2]],员工2的数据结构是[2, 10, [3]],员工3的数据结构是[3, 5, []]。注意虽然员工3也是员工1的一个下属,但是由于并不是直系下属,因此没有体现在员工1的数据结构中。 + +现在输入一个公司的所有员工信息,以及单个员工id,返回这个员工和他所有下属的重要度之和。 + +示例 1: + +输入: [[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1 +输出: 11 +解释: +员工1自身的重要度是5,他有两个直系下属2和3,而且2和3的重要度均为3。因此员工1的总重要度是 5 + 3 + 3 = 11。 + +''' + +""" +# Definition for Employee. +class Employee: + def __init__(self, id: int, importance: int, subordinates: List[int]): + self.id = id + self.importance = importance + self.subordinates = subordinates +""" +from collections import deque + +class Solution: + def getImportance(self, employees: List['Employee'], id: int) -> int: + employees_dict = {employee.id: employee for employee in employees} + que = deque() + importance = 0 + que.append(employees_dict[id]) + while que: + employee = que.popleft() + importance += employee.importance + sub_employee_ids = employee.subordinates + for sub_id in sub_employee_ids: + que.append(employees_dict[sub_id]) + + return importance diff --git a/src/main/com/libin/yfl/78.py b/src/main/com/libin/yfl/78.py new file mode 100644 index 0000000..fb71b01 --- /dev/null +++ b/src/main/com/libin/yfl/78.py @@ -0,0 +1,30 @@ +# coding:utf-8 +''' +344. 反转字符串 +编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 + +不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 + +你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。 + +示例 1: + +输入:["h","e","l","l","o"] +输出:["o","l","l","e","h"] +示例 2: + +输入:["H","a","n","n","a","h"] +输出:["h","a","n","n","a","H"] +''' + + +class Solution: + def reverseString(self, s: List[str]) -> None: + """ + Do not return anything, modify s in-place instead. + """ + i, j = 0, len(s) - 1 + while i < j: + s[i], s[j] = s[j], s[i] + i += 1 + j -= 1 diff --git a/src/main/com/libin/yfl/79.py b/src/main/com/libin/yfl/79.py new file mode 100644 index 0000000..806dc6a --- /dev/null +++ b/src/main/com/libin/yfl/79.py @@ -0,0 +1,37 @@ +# coding:utf-8 +''' +459. 重复的子字符串 +给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 + +示例 1: + +输入: "abab" + +输出: True + +解释: 可由子字符串 "ab" 重复两次构成。 +示例 2: + +输入: "aba" + +输出: False +示例 3: + +输入: "abcabcabcabc" + +输出: True + +解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。) +''' + + +class Solution: + def repeatedSubstringPattern(self, s: str) -> bool: + if not s or len(s) == 1: + return False + for i in range(1, len(s)): + result = s[:i] + len_1 = len(result) + if result * (len(s) // len_1) == s: + return True + return False diff --git a/src/main/com/libin/yfl/database/1.py b/src/main/com/libin/yfl/database/1.py new file mode 100644 index 0000000..152566e --- /dev/null +++ b/src/main/com/libin/yfl/database/1.py @@ -0,0 +1,27 @@ +''' +627. 交换工资 +SQL架构 +给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求只使用一个更新(Update)语句,并且没有中间的临时表。 + +注意,您必只能写一个 Update 语句,请不要编写任何 Select 语句。 + +例如: + +| id | name | sex | salary | +|----|------|-----|--------| +| 1 | A | m | 2500 | +| 2 | B | f | 1500 | +| 3 | C | m | 5500 | +| 4 | D | f | 500 | +运行你所编写的更新语句之后,将会得到以下表: + +| id | name | sex | salary | +|----|------|-----|--------| +| 1 | A | f | 2500 | +| 2 | B | m | 1500 | +| 3 | C | f | 5500 | +| 4 | D | m | 500 | + +''' +# Write your MySQL query statement below +# update salary set sex = if(sex='m','f','m') diff --git a/src/main/com/libin/yfl/database/__init__.py b/src/main/com/libin/yfl/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/main/com/libin/yfl/sequence/1.py b/src/main/com/libin/yfl/sequence/1.py new file mode 100644 index 0000000..a70f26d --- /dev/null +++ b/src/main/com/libin/yfl/sequence/1.py @@ -0,0 +1,36 @@ +''' +976. 三角形的最大周长 +给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。 + +如果不能形成任何面积不为零的三角形,返回 0。 + + + +示例 1: + +输入:[2,1,2] +输出:5 +示例 2: + +输入:[1,2,1] +输出:0 +示例 3: + +输入:[3,2,3,4] +输出:10 +示例 4: + +输入:[3,6,2,3] +输出:8 +''' + + +class Solution: + def largestPerimeter(self, A: List[int]) -> int: + A.sort() + A.reverse() + for i in range(len(A)): + if i == len(A) - 2: + return 0 + if A[i] < A[i + 2] + A[i + 1]: + return A[i] + A[i + 1] + A[i + 2] diff --git a/src/main/com/libin/yfl/sequence/__init__.py b/src/main/com/libin/yfl/sequence/__init__.py new file mode 100644 index 0000000..e69de29 diff --git "a/src/main/com/libin/yfl/\344\275\215\350\277\220\347\256\227/1.py" "b/src/main/com/libin/yfl/\344\275\215\350\277\220\347\256\227/1.py" new file mode 100644 index 0000000..3ae9166 --- /dev/null +++ "b/src/main/com/libin/yfl/\344\275\215\350\277\220\347\256\227/1.py" @@ -0,0 +1,36 @@ +# coding:utf-8 +''' +面试题 17.10. 主要元素 +数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。 + +示例 1: + +输入:[1,2,5,9,5,9,5,5,5] +输出:5 + + +示例 2: + +输入:[3,2] +输出:-1 + + +示例 3: + +输入:[2,2,1,1,1,2,2] +输出:2 +''' + + +class Solution: + def majorityElement(self, nums: List[int]) -> int: + dict1 = {} + for each in nums: + if each not in dict1: + dict1[each] = 1 + else: + dict1[each] += 1 + for key in dict1: + if dict1[key] > len(nums) // 2: + return key + return -1 diff --git "a/src/main/com/libin/yfl/\344\275\215\350\277\220\347\256\227/2.py" "b/src/main/com/libin/yfl/\344\275\215\350\277\220\347\256\227/2.py" new file mode 100644 index 0000000..6744fa5 --- /dev/null +++ "b/src/main/com/libin/yfl/\344\275\215\350\277\220\347\256\227/2.py" @@ -0,0 +1,12 @@ +''' +面试题 16.07. 最大数值 +编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。 + +示例: + +输入: a = 1, b = 2 +输出: 2 +''' +class Solution: + def maximum(self, a: int, b: int) -> int: + return ((a+b)+abs(a-b)) // 2 \ No newline at end of file diff --git "a/src/main/com/libin/yfl/\344\275\215\350\277\220\347\256\227/3.py" "b/src/main/com/libin/yfl/\344\275\215\350\277\220\347\256\227/3.py" new file mode 100644 index 0000000..c4ef4d6 --- /dev/null +++ "b/src/main/com/libin/yfl/\344\275\215\350\277\220\347\256\227/3.py" @@ -0,0 +1,19 @@ +''' +面试题 17.01. 不用加号的加法 +设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。 + +示例: + +输入: a = 1, b = 1 +输出: 2 + +''' +class Solution: + def add(self, a: int, b: int) -> int: + a &= 0xFFFFFFFF + b &= 0xFFFFFFFF + while b != 0: + carry = a & b + a ^= b + b = ((carry) << 1) & 0xFFFFFFFF + return a if a < 0x80000000 else ~(a^0xFFFFFFFF) diff --git "a/src/main/com/libin/yfl/\344\275\215\350\277\220\347\256\227/__init__.py" "b/src/main/com/libin/yfl/\344\275\215\350\277\220\347\256\227/__init__.py" new file mode 100644 index 0000000..e69de29 diff --git "a/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-17.py" "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-17.py" new file mode 100644 index 0000000..75b9311 --- /dev/null +++ "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-17.py" @@ -0,0 +1,22 @@ +# coding:utf-8 +''' +剑指 Offer 17. 打印从1到最大的n位数 +输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 + +示例 1: + +输入: n = 1 +输出: [1,2,3,4,5,6,7,8,9] + +说明: + +用返回一个整数列表来代替打印 +n 为正整数 +''' + +class Solution: + def printNumbers(self, n: int) -> List[int]: + res = [] + for i in range(1, 10 ** n): + res.append(i) + return res diff --git "a/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-21.py" "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-21.py" new file mode 100644 index 0000000..4f41742 --- /dev/null +++ "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-21.py" @@ -0,0 +1,24 @@ +# coding:utf-8 +''' +剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 +输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 + +示例: + +输入:nums = [1,2,3,4] +输出:[1,3,2,4] +注:[3,1,2,4] 也是正确的答案之一。 + +提示: + +1 <= nums.length <= 50000 +1 <= nums[i] <= 10000 +''' +def exchange(nums): + list1 = [] + for each in nums: + if each % 2 == 0: + list1.append(each) + else: + list1.insert(0,each) + return list1 \ No newline at end of file diff --git "a/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-22.py" "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-22.py" new file mode 100644 index 0000000..f3acc30 --- /dev/null +++ "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-22.py" @@ -0,0 +1,21 @@ +# coding:utf-8 +''' +剑指 Offer 22. 链表中倒数第k个节点 +输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。 +示例: +给定一个链表: 1->2->3->4->5, 和 k = 2. +返回链表 4->5. +''' +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None + +class Solution: + def getKthFromEnd(self, head: ListNode, k: int) -> ListNode: + result = [] + while head: + result.append(head) + head = head.next + return result[-k] diff --git "a/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-25.py" "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-25.py" new file mode 100644 index 0000000..a559683 --- /dev/null +++ "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-25.py" @@ -0,0 +1,37 @@ +# coding:utf-8 +''' +剑指 Offer 25. 合并两个排序的链表 +输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 + +示例1: + +输入:1->2->4, 1->3->4 +输出:1->1->2->3->4->4 +限制: + +0 <= 链表长度 <= 1000 +''' + +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None + +class Solution: + def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: + if not l1: + return l2 + if not l2: + return l1 + cur = res = ListNode(0) + while l1 and l2: + if l1.val < l2.val: + cur.next = l1 + l1 = l1.next + else: + cur.next = l2 + l2 = l2.next + cur = cur.next + cur.next = l1 if l1 else l2 + return res.next diff --git "a/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-40.py" "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-40.py" new file mode 100644 index 0000000..fd185c4 --- /dev/null +++ "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-40.py" @@ -0,0 +1,20 @@ +# coding:utf-8 +''' +剑指 Offer 40. 最小的k个数 +输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 + +示例 1: + +输入:arr = [3,2,1], k = 2 +输出:[1,2] 或者 [2,1] +示例 2: + +输入:arr = [0,1,2,1], k = 1 +输出:[0] + +''' + +class Solution: + def getLeastNumbers(self, arr: List[int], k: int) -> List[int]: + arr.sort() + return arr[:k] \ No newline at end of file diff --git "a/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-43.py" "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-43.py" new file mode 100644 index 0000000..b956a14 --- /dev/null +++ "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-43.py" @@ -0,0 +1,39 @@ +# coding:utf-8 +''' +剑指 Offer 43. 1~n整数中1出现的次数 +输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。 + +例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。 + + + +示例 1: + +输入:n = 12 +输出:5 +示例 2: + +输入:n = 13 +输出:6 + + +限制: + +1 <= n < 2^31 + +''' + + +class Solution: + def countDigitOne(self, n: int) -> int: + digit, res = 1, 0 + high, cur, low = n // 10, n % 10, 0 + while high != 0 or cur != 0: + if cur == 0: res += high * digit + elif cur == 1: res += high * digit + low + 1 + else: res += (high + 1) * digit + low += cur * digit + cur = high % 10 + high //= 10 + digit *= 10 + return res diff --git "a/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-49.py" "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-49.py" new file mode 100644 index 0000000..2ec4fff --- /dev/null +++ "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-49.py" @@ -0,0 +1,33 @@ +# coding:utf-8 +''' +剑指 Offer 49. 丑数 +我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。 + +示例: + +输入: n = 10 +输出: 12 +解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 + + +说明: +1 是丑数。 +n 不超过1690。 +''' + + +class Solution: + def nthUglyNumber(self, n: int) -> int: + dp, a, b, c = [1] * n, 0, 0, 0 + for i in range(1, n): + n2, n3, n5 = dp[a] * 2, dp[b] * 3, dp[c] * 5 + dp[i] = min(n2, n3, n5) + if dp[i] == n2: + a += 1 + if dp[i] == n3: + b += 1 + if dp[i] == n5: + c += 1 + return dp[-1] + +# 提示:动态规划问题 diff --git "a/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-57-1.py" "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-57-1.py" new file mode 100644 index 0000000..85c9472 --- /dev/null +++ "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-57-1.py" @@ -0,0 +1,43 @@ +# coding:utf-8 +''' +剑指 Offer 57. 和为s的两个数字 +输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。 + +示例 1: + +输入:nums = [2,7,11,15], target = 9 +输出:[2,7] 或者 [7,2] +示例 2: + +输入:nums = [10,26,30,31,47,60], target = 40 +输出:[10,30] 或者 [30,10] +''' +class Solution: + def twoSum(self, nums: List[int], target: int) -> List[int]: + start, end = 0, len(nums) - 1 + while start < end: + res = nums[start] + nums[end] + if res == target: + return [nums[start], nums[end]] + if res > target: + end = end - 1 + if res < target: + start = start + 1 + return [] + + + +# 下面的方法在提交的过程中会出现超时的现象 +class Solution: + def twoSum(self, nums: List[int], target: int) -> List[int]: + if len(nums) < 2: + return [] + for i in range(len(nums)): + if nums[i] >= target: + break + for j in range(i + 1, len(nums)): + if nums[j] >= target: + break + if nums[i] + nums[j] == target: + return [nums[i], nums[j]] + return [] diff --git "a/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-57.py" "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-57.py" new file mode 100644 index 0000000..cc98b48 --- /dev/null +++ "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-57.py" @@ -0,0 +1,34 @@ +# coding:utf-8 +''' +题目:剑指 Offer 57 - II. 和为s的连续正数序列 +输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 + +序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 + +示例 1: + +输入:target = 9 +输出:[[2,3,4],[4,5]] +示例 2: + +输入:target = 15 +输出:[[1,2,3,4,5],[4,5,6],[7,8]] + +提示: +等差数列求和 +''' + + +class Solution: + def findContinuousSequence(self, target: int) -> List[List[int]]: + if target <= 2: + return [] + res = [] + for i in range(2, target + 1): + linshi = target - i * (i - 1) // 2 + if linshi <= 0: + break + if not linshi % i: + start = linshi // i + res.append([start+j for j in range(i)]) + return res[::-1] diff --git "a/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-58.py" "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-58.py" new file mode 100644 index 0000000..b89dad3 --- /dev/null +++ "b/src/main/com/libin/yfl/\345\211\221\346\214\207offer/offer-58.py" @@ -0,0 +1,32 @@ +# coding:utf-8 +''' +剑指 Offer 58 - I. 翻转单词顺序 +输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。 + +示例 1: + +输入: "the sky is blue" +输出: "blue is sky the" +示例 2: + +输入: " hello world! " +输出: "world! hello" +解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 +示例 3: + +输入: "a good example" +输出: "example good a" +解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。 + + +''' + + +class Solution: + def reverseWords(self, s: str) -> str: + res = [] + for each in s.split(): + if each == '': + continue + res.append(each) + return ' '.join(res[::-1]) diff --git a/studyMaven.iml b/studyMaven.iml index d61d140..6a7ab57 100644 --- a/studyMaven.iml +++ b/studyMaven.iml @@ -1,8 +1,6 @@ - - - + @@ -11,7 +9,7 @@ - + @@ -160,7 +158,6 @@ -