主要记录python的力扣题解
参考的优质网站:
算法通关手册(LeetCode) | 算法通关手册(LeetCode) (itcharge.cn)
代码随想录 (programmercarl.com)
2024.6.28
题目:轮转数组
官网连接:189. 轮转数组 - 力扣(LeetCode)
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3 输出:[5,6,7,1,2,3,4] 解释: 向右轮转 1 步:[7,1,2,3,4,5,6] 向右轮转 2 步:[6,7,1,2,3,4,5] 向右轮转 3 步:[5,6,7,1,2,3,4]
示例 2:
输入:nums = [-1,-100,3,99], k = 2 输出:[3,99,-1,-100] 解释: 向右轮转 1 步: [99,-1,-100,3] 向右轮转 2 步: [3,99,-1,-100]
思考10分钟~
解题思路:
可先把整个数组翻转一下,这样后半段元素就到了前边,前半段元素就到了后边,只不过元素顺序是反着的。我们再从 𝑘k 位置分隔开,将 [0...𝑘−1][0...k−1] 区间上的元素和 [𝑘...𝑛−1][k...n−1] 区间上的元素再翻转一下,就得到了最终结果。
python语言:
class Solution:
def rotate(self, nums: List[int], k:int) -> None:
def reverse(i:int, j:int) -> None:
while i < j:
nums[i], nums[j] = nums[j], nums[i]
i += 1
j -= 1
n = len(nums)
k %= n
reverse(0,n-1)
reverse(0,k-1)
reverse(k,n-1)
class solution:
def rotate(self, nums:List[int], k:int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
k %= n
def reverse(self, nums:List[int], L:int, R:int) -> None
while L < R:
nums[L], nums[R] = nums[R], nums[L]
L += 1
R -= 1
C 语言
void rotate(int* nums, int numsSize, int k)
{
k %= numsSize;
reverse(nums, 0, numsSize-1);
reverse(nums, 0, k-1);
reverse(nums, k, numsSize-1);
}
void reverse(int* nums, int L, int R)
{
while (L < R)
{
int temp = nums[L];
nums[L] = nums[R];
num[R] = temp;
L++;
R--;
}
}
2024.07.01
题目:加一
官网连接:66. 加一 - 力扣(LeetCode)
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1] 输出:[4,3,2,2] 解释:输入数组表示数字 4321。
思考10分钟~
解题思路:
这道题把整个数组看成了一个整数,然后个位数加 11。问题的实质是利用数组模拟加法运算。
如果个位数不为 99 的话,直接把个位数加 11 就好。如果个位数为 99 的话,还要考虑进位。
具体步骤:
- 数组前补 00 位。
- 将个位数字进行加 11 计算。
- 遍历数组
- 如果该位数字大于等于 1010,则向下一位进 11,继续下一位判断进位。
- 如果该位数字小于 1010,则跳出循环。
python语言:
class Solution:
def plusOne(self, digits:List[int]) -> List[int]:
digits = [0] + digits
digits[len(digits) - 1] += 1
for i in range(len(digits)-1, 0, -1):
if digits[i] != 10:
break
else:
digits[i] = 0
digits[i -1] += 1
if digits[0] == 0:
return digits[1:0]
else:
return digits
思路二:字数类型转换
class solution:
def plusOne(self, digits:List[int]) -> List[int]:
s = ""
l = []
for i in digits:
s += str(i)
for i in str(int(s)+1):
l.append(int(i))
return l
return list(map(int, str(int("".join(list(map(str, digits)))) + 1)))
C 语言
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* plusOne(int* digits, int digitsSize, int* returnSize)
{
for(int i = digitsSize -1; i >= 0; --i)
{
digits[i] += 1;
if (digits[i] != 10)
{
*returnSize = digitsSize;
return digits;
}
if (digits[i] == 10)
{
digits[i] =0;
}
}
//元素全为9开辟新数组
int* ans = malloc(sizeof(int) * (digitsSize + 1));
memset(ans, 0, sizeof(int) * (digitsSize + 1));//全部置0
ans[0] = 1;
*returnSize = digitsSize + 1;
return ans;
}