算法题笔记

发布于:2024-07-02 ⋅ 阅读:(145) ⋅ 点赞:(0)

主要记录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 的话,还要考虑进位。

具体步骤:

  1. 数组前补 00 位。
  2. 将个位数字进行加 11 计算。
  3. 遍历数组
  • 如果该位数字大于等于 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;


    
}


网站公告

今日签到

点亮在社区的每一天
去签到