LeetCode66_Plus One

这道题原理上比较简单,但是不知为何自己的函数返回值一直为空。。怀疑自己的malloc函数用法不对,于是参考了别人的代码。。。

具体题目如下:

Given a non-empty array of digits representing a non-negative integer, plus one to the integer.

The digits are stored such that the most significant digit is at the head of the list, and each element in the array contain a single digit.

You may assume the integer does not contain any leading zero, except the number 0 itself.

Example 1:

Input: [1,2,3]
Output: [1,2,4]
Explanation: The array represents the integer 123.

Example 2:

Input: [4,3,2,1]
Output: [4,3,2,2]
Explanation: The array represents the integer 4321.

这道题的解决思路有两种:

一种是把数组还原成整数,整数加1,再按数组存储;

另一种是按进位逐位处理每个数字,最后判断首位是否溢出,溢出则重新分配内存。

先贴自己的代码(属于第一种思路,但改完之后输出还一直为空,有时间再改改):

int* plusOne(int* digits, int digitsSize, int* returnSize) {
    int i,j,temp,sum=0;
    int* result;
    int len=digitsSize;
    for(i=0;i<digitsSize;i++){
        sum=sum+digits[i]*(10^(digitsSize-1-i));//c语言中次方应该用POW函数(double型),用^好像不行???
    }
    sum=sum+1;
    if(sum/(10^digitsSize)==1){
        len++;
    }
    result=malloc(len*sizeof(int));//这里malloc函数使用错误,正确的应该是int* result=(int*)malloc(len*sizeof(int));//重新分配的函数remalloc参考代码里有用过,直接一行(int*)realloc(result,(digitsSize+1)*sizeof(int));就可以
    while(len){
        result[len-1]=sum%10;
        sum=sum/10;
        len--;
    }
    return result;
}
 

然后是别人的代码(属于第二种思路,遍历较少,参考https://blog.csdn.net/lv1224/article/details/52839407):

/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* plusOne(int* digits, int digitsSize, int* returnSize) {
    int* result=(int*)malloc(digitsSize*sizeof(int));//初始化内存按原数组大小,注意格式(int*)!!!
    int flag=1;   //进位标识符,首位加1也用这个一并处理了
    for(int i=digitsSize-1;i>=0;i--)
    {
            result[i]=(digits[i]+flag)%10;//逐位赋值用10取余数(即个位数);

            flag=(digits[i]+flag)/10;//进位标识符除以10取高位(即十位数);//这样的逐位赋值和进位处理具有连续性;

    }
    if(flag==0)
    {
        *returnSize=digitsSize;
    }
    else
    {
        *returnSize=digitsSize+1;//处理最高位溢出的情况。用最后一个flag进行判断;
        (int*)realloc(result,(digitsSize+1)*sizeof(int));//注意重新分配内存空间的realloc函数格式!!!
        for(int i=digitsSize;i>0;i--)
        {
            result[i]=result[i-1];//全体后移一位,即i变大了1;
        }
        result[0]=1;//最高位补1;
    }
    return result;
}

java版本思路跟c版本不一样,感觉逻辑比较复杂,但也不难理解。

(自己试过转换成数值+1再拆开成数组的,但感觉比较麻烦。。)

//思路是:从尾开始遍历,如果当前值加上进位大于9,那么当前值就为0,并且继续进位,否则则直接返回。
class Solution {
    public int[] plusOne(int[] digits) {
        int n = digits.length;
        for(int i=n-1; i>=0; i--) {
            if(digits[i] < 9) {
                digits[i]++;
                return digits;
            }//不管是完全没有进位还是进位到某一位的情况,都是遇到小于9的数一定会结束
            digits[i] = 0;//在结束之前遇到的所有9都应该置零,并在9后面的数字+1后结束
        }
        //如果没有在之前的步骤中跳出,说明之前遇到的所有数字都是9被置零,也就是最后有进位1,得到的应该是1个1后面n个零
        int[] newNumber = new int [n+1];
        newNumber[0] = 1;//其他位默认为0???
        return newNumber;
    }
}
 

猜你喜欢

转载自blog.csdn.net/lilililililydia/article/details/81047864