Leetcode 66 加一 C语言

Leetcode 66 加一 C语言

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:

输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。

思路1:2年前写的。。先判断如果数字都是9的话,则会产生进位;carry用于表示是否需要多一位,p用于表示进位;先分配内存,从后往前利用carry的距离差进行赋值。

int* plusOne(int* digits, int digitsSize, int* returnSize) {
    int carry = 1;
    for (int i = 0; i < digitsSize; i++){
        if (digits[i] != 9){
            carry = 0;
            break;
        }
    }
    int* plusone = (int*)malloc(sizeof(int)*(digitsSize+carry));
    int p = 1;    
    for (int i = digitsSize-1 ; i >= 0; i--){  
        plusone[i+carry] = digits[i] + p;
        if(plusone[i+carry]>=10)
        {
            plusone[i+carry]-=10;
            p=1;
        }
        else
        {
            p=0;
        }
    }
    if(carry)
        plusone[0]=1;
  *returnSize = digitsSize+carry;
    return plusone;
}

思路2:从数组尾部开始模拟加法运算;并在原数组上修改,若最高位无进位,则直接返回;若有进位,则需申请空间,扩充原数组。

int* plusOne(int* digits, int digitsSize, int* returnSize){
   int flag=1;
   for(int i=digitsSize-1;i>=0;i--)
   {
       if(digits[i]==9&&flag==1)
       {
             digits[i]=0;
             flag=1;
       }
       else if(digits[i]!=9)
       {
           digits[i]=digits[i]+flag;
           flag=0;
       }
   }
   *returnSize=digitsSize+flag;
   if(*digits!=0)
   {
      // *returnSize=digitsSize;
       return digits;
   }
   else
   {
       //*returnSize=digitsSize+1;
       int *p2=(int *)malloc(sizeof(int)*(*returnSize));
       memset(p2,0,*returnSize);
       p2[0]=1;
       for(int j=1;j<*returnSize;j++)
       {
           p2[j]=digits[j-1];
       }
       return p2;
   }
   return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目描述: 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路: 这是一个典型的回溯算法的问题,我们可以通过递归的方式实现。我们先固定一个数,再递归求解剩下的数的排列,最后再将固定的数和递归求解的结果合并。 代码实现: void backtrack(int* nums, int numsSize, int** result, int* returnSize, int index) { if (index == numsSize) { // 递归结束 result[*returnSize] = (int *)malloc(numsSize * sizeof(int)); // 为result分配空间 memcpy(result[*returnSize], nums, numsSize * sizeof(int)); // 将nums复制到result中 (*returnSize)++; // 返回结果数量自增1 return; } for (int i = index; i < numsSize; i++) { // 遍历数组 // 交换元素 int temp = nums[index]; nums[index] = nums[i]; nums[i] = temp; // 递归 backtrack(nums, numsSize, result, returnSize, index + 1); // 恢复原数组 temp = nums[index]; nums[index] = nums[i]; nums[i] = temp; } } int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) { int count = 1; for (int i = 2; i <= numsSize; i++) { count *= i; // 计算排列的总数 } int** result = (int **)malloc(count * sizeof(int *)); *returnColumnSizes = (int *)malloc(count * sizeof(int)); *returnSize = 0; backtrack(nums, numsSize, result, returnSize, 0); for (int i = 0; i < *returnSize; i++) { (*returnColumnSizes)[i] = numsSize; } return result; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值