代码重构 【Github Actions】

This commit is contained in:
github-actions[bot]
2021-07-23 15:44:19 +00:00
parent c79cac3d9c
commit f671c90754
94 changed files with 1609 additions and 2111 deletions

View File

@@ -1,8 +1,8 @@
> 如果阅读时发现错误或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
> 如果阅读时发现错误或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
>
> 感谢支持该仓库会一直维护希望对各位有一丢丢帮助
>
> 另外希望手机阅读的同学可以来我的 <u>[**公众号袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
> 另外希望手机阅读的同学可以来我的 <u>[**公众号袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
之前我们说过了如何利用快速排序解决荷兰国旗问题下面我们看下这两个题目
@@ -22,7 +22,7 @@
> 输入: [3,30,34,5,9]
> 输出: "3033459"
题目很容易理解就是让我们找出拼接的所有数字中最小的一个但是我们需要注意的是因为输出结果较大所以我们不能返回 int 应该将数字转换成字符串所以这类问题还是隐形的大数问题
题目很容易理解就是让我们找出拼接的所有数字中最小的一个但是我们需要注意的是因为输出结果较大所以我们不能返回 int 应该将数字转换成字符串所以这类问题还是隐形的大数问题
我们看到这个题目时可能想到的是这种解题思路我们首先求出数组中所有数字的全排列然后将排列拼起来最后再从中取出最小的值但是我们共有 n 个数则有 n 个排列显然数目是十分庞大的那么我们有没有其他更高效的方法呢
@@ -30,17 +30,17 @@
我们假设两个数字 m , n 可以拼接成 mn nm 那么我们怎么返回最小的那个数字呢
我们需要比较 mn nm 假设 mn < nm 则此时我们求得的最小数字就是 mn
我们需要比较 mn nm 假设 mn < nm 则此时我们求得的最小数字就是 mn
> mn 代表 m n 进行拼接例如 m = 10, n = 1mn = 101
mn < nm 得到最小数字 mn, 因为在最小数字 mn m 排在 n 的前面我们此时定义 m "小于" n
mn < nm 得到最小数字 mn, 因为在最小数字 mn m 排在 n 的前面我们此时定义 m "小于" n
**注意此时的 "小于" 并不是数值的 < 是我们自己定义因为 m 在最小数字 mn 中位于 n 的前面所以我们定义 m 小于 n**
**注意此时的 "小于" 并不是数值的 < 是我们自己定义因为 m 在最小数字 mn 中位于 n 的前面所以我们定义 m 小于 n**
下面我们通过一个例子来加深下理解
假设 = 10n = 1 则有 mn = 101 nm = 110
假设 = 10n = 1 则有 mn = 101 nm = 110
我们比较 101 110 发现 101 < 110 所以此时我们的最小数字为 101 又因为在最小数字中 10 (m) 排在 1(n) 的前面我们根据定义则是 10 小于 1反之亦然
@@ -60,29 +60,29 @@
如果 A小于 B AB < BA, 假设 A B 用十进制表示时分别有 a 位和 b
AB = A * 10 ^ b + B , BA = B * 10 ^ a + A
AB = A _ 10 ^ b + B , BA = B _ 10 ^ a + A
> A = 10, a = 2 (两位数) B = 1, b = 1 (一位数)
>
> AB = A * 10 ^ b + B = 10 * 10 ^ 1 + 1 = 101
> AB = A _ 10 ^ b + B = 10 _ 10 ^ 1 + 1 = 101
>
> BA = B * 10 ^ a + A = 1 * 10 ^ 2 + 10 = 110
> BA = B _ 10 ^ a + A = 1 _ 10 ^ 2 + 10 = 110
AB < BA **A * 10 ^ b + B < BA = B * 10 ^ a + A** 整理得
AB < BA **A _ 10 ^ b + B < BA = B _ 10 ^ a + A** 整理得
A / (10^a - 1) < B / (10 ^ b - 1)
A / (10^a - 1) < B / (10 ^ b - 1)
同理如果 B 小于 C BC < CB ,C 用十进制表示时有 c 和前面推导过程一样
BC = B * 10 ^ c + C
BC = B \* 10 ^ c + C
CB = C * 10 ^ b + B
CB = C \* 10 ^ b + B
BC < CB 整理得 B / (10 ^ b - 1) < C / (10 ^ c - 1);
BC < CB 整理得 B / (10 ^ b - 1) < C / (10 ^ c - 1);
我们通过 A / (10 ^ a - 1) < B / (10 ^ b - 1) B / (10 ^ b - 1) < C / (10 ^ c - 1);
我们通过 A / (10 ^ a - 1) < B / (10 ^ b - 1) B / (10 ^ b - 1) < C / (10 ^ c - 1);
可以得到 A / (10^a - 1) < C / (10 ^ c - 1)
可以得到 A / (10^a - 1) < C / (10 ^ c - 1)
则可以得到 AC < CA A 小于 C
@@ -96,25 +96,23 @@ BC < CB 整理得 B / (10 ^ b - 1) < C / (10 ^ c - 1);
> mn < nm 得到最小数字 mn, 因为在最小数字 mn m 排在 n 的前面
>
> 我们此时定义 m "小于" n
> 我们此时定义 m "小于" n
我们假设我们根据上诉规则得到的数字为 xxxxxxxx
存在这么一对字符串 A B ,虽然 AB < BA 按照规则 A 应该排在 B 的前面但是在最后结果中 A 排在 B 的后面则此时共有这么几种情况
存在这么一对字符串 A B ,虽然 AB < BA 按照规则 A 应该排在 B 的前面但是在最后结果中 A 排在 B 的后面则此时共有这么几种情况
见下图
![](https://cdn.jsdelivr.net/gh/tan45du/test@master/photo/微信截图_20210306160015.5x1o7nyb6c40.png)
其实我们可以归结为两大类 B A 之间没有其他值 B A 之间有其他值
我们先来看**没有其他值**的情况
假设我们求得的最小值为 XXXXBA, 虽然 A "小于" B,但是在最后结果中 B 排在了 A 的前面这和我们之前定义的规则是冲突的大家思考一下这个值为最小值吗
假设我们求得的最小值为 XXXXBA, 虽然 A "小于" B,但是在最后结果中 B 排在了 A 的前面这和我们之前定义的规则是冲突的大家思考一下这个值为最小值吗
假设 XXXXBA为最小值但是因为 A "小于" B , AB < BA ,
假设 XXXXBA 为最小值但是因为 A "小于" B , AB < BA ,
所以 XXXXAB 一定小于 XXXXBA
@@ -136,11 +134,11 @@ BC < CB 整理得 B / (10 ^ b - 1) < C / (10 ^ c - 1);
根据我们之前证明的传递性
B "小于" A
B "小于" A
但是我们假设是 A 小于 B ,与假设冲突证得
综上所述得出假设不成立从而得出结论对于排成的最小数字不存在满足下述关系的一对字符串虽然 A "小于" B , 但是在最后结果中 B 排在了 A 的前面.
综上所述得出假设不成立从而得出结论对于排成的最小数字不存在满足下述关系的一对字符串虽然 A "小于" B , 但是在最后结果中 B 排在了 A 的前面.
好啦我们证明我们定义的规则有效下面我们直接看代码吧继续使用我们的三向切分来解决
@@ -148,7 +146,7 @@ Java Code:
```java
class Solution {
public String minNumber(int[] nums) {
public String minNumber(int[] nums) {
String[] arr = new String[nums.length];
//解决大数问题,将数字转换为字符串
for (int i = 0 ; i < nums.length; ++i) {
@@ -157,7 +155,7 @@ class Solution {
quickSort(arr,0,arr.length-1);
StringBuffer str = new StringBuffer();
for (String x : arr) {
str.append(x);
}
@@ -182,10 +180,10 @@ class Solution {
i++;
}
}
quickSort(arr,left,low-1);
quickSort(arr,high+1,right);
}
public void swap(String[] arr, int i, int j) {
String temp = arr[i];
@@ -201,7 +199,7 @@ Python Code:
from typing import List
class Solution:
def minNumber(self, nums: List[int])->str:
arr = [''] * len(nums)
# 解决大数问题将数字转换为字符串
for i in range(0, len(nums)):
@@ -212,7 +210,7 @@ class Solution:
for x in arr:
s += x
return s
def quickSort(self, arr: List[str], left: int, right: int):
if left >= right:
return
@@ -220,7 +218,7 @@ class Solution:
high = right
i = low + 1
pivot = arr[low]
while i <= high:
# 比较大小
if int(pivot + arr[i]) > int(arr[i] + pivot):
@@ -232,7 +230,7 @@ class Solution:
high -= 1
else:
i += 1
self.quickSort(arr, left, low - 1)
self.quickSort(arr, high + 1, right)
@@ -241,18 +239,3 @@ class Solution:
arr[i] = arr[j]
arr[j] = temp
```