leetCode 66.Plus One 66(分治法)

申明

这是小白编程的第一个阶段:学习别人优秀的思想并补充完整达到可以完全理解的地步,一般在网上看到的leedcode的代码只有子函数小白我都不知道怎么补充main来测试和理解代码。这段时间我会一步一步把代码补充完整自行理解以此记录我的学习过程。

题目描述:

给定一个表示非负整数的非空数字数组加上整数1.存储数字使得最高有效数字位于列表的开头,并且数组中的每个元素包含单个数字即0~9。你可以假设整数不包含任何前导零,除了数字0本身。
Input: [1,2,3]
Output: [1,2,4]

输出形式:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* plusOne(int* digits, int digitsSize, int* returnSize){

}

leedcode最高得分的答案解析,自己手动补充的main()写的有点垃圾
(大佬自行跳过,菜是原罪)
算法思想:
利用vector创建动态数组,倒序遍历节约空间和时间。
具体思想可以参考下面测试代码,我会详细讲解

完整代码

#include 
#include 
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//vector是封装动态大小数组的顺序容器,即能够存放任意类型的动态数组
// vector &digits 创建一个向量存储容器 类型 int型数组 
void plusone(vector &digits)
{
    int n = digits.size();
    for (int i = n - 1; i >= 0; --i)
    {
        if (digits[i] == 9)
        {
            digits[i] = 0;
        }
        else
        {
            cout<<"digits[i]变化之前:"<

测试

总共三种情况,并把子函数中的i值输出
1,digits =[0,9]
第一种情况,只有最后一位是9时,进入子函数plusone()执行if语句,此时digits[1]=0,digit[0]不等于9就会把digit[0]加一并return输出此时程序就已经执行完毕


image.png

2, digits =[0,1,2,3,4,8]
第二种情况,数组中没有出现9,进入子函数plusone()后直接把最后一位加一并输出。下图中8和9是最后一位数据变化前后的输出情况,此时程序就执行完毕。


image.png

3,digits =[9,9]
第三种情况,数组中都是9,进入子函数plusone()后只执行if语句:digits[1]=0,digit[0]=0
从for循环出来使digits[0] =1,此时digits =[1,0]然后在数组中添加一个数据0,使数组变为digits =[1,0,0]满足条件程序执行完毕。


image.png

总结: 遇到这种题就要把所有可能的情况都考虑进去并一一实现,这种方式确实amazing。学习到了!!!
另一个高分答案和第一个思想差不多,判断数组元素的部分更加简洁用时更短。代码中plusOne()中的if语句是用于判断数组元素全为9的情况。还是用的vector动态数组仍能用上面的三个测试用例检测所有的情况。代码贴出来:

#include 
#include 
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//vector是封装动态大小数组的顺序容器,即能够存放任意类型的动态数组
// vector &digits 创建一个向量存储容器 类型 int型数组 
class Solution {
public:
    vector plusOne(vector &digits) {
        bool carry = true;
        // ==的优先级高于= 
        for(int i=digits.size()-1; i >= 0 && carry; i--) {
            carry = (++digits[i]%=10) == 0;
            cout<<"carry值的变化:"< &digits);
    Solution solution;
    vector vec;
    int i=0; 
    //int a[10]={0,1,2,3,4,8}; 
    //int a[10]={0,9};
    int a[10]={9,9};
    for(i=0;i<2;i++)
    {
       vec.push_back(a[i]);
    }

    vector::iterator pos;
    //声明一个迭代器,来访问vector容器。作用:遍历或指向vector容器的元素 
    for(pos = vec.begin();pos!=vec.end();pos++)
    {
        cout<<*pos<<" ";
    } 
    cout<

当真前两天是小白,连leetcode中运行代码的代码方式都选错了导致搞不太清楚子函数和主函数怎么对接起来。现在发现问题还不算晚,希望以后更加认真吧


你可能感兴趣的:(leetCode 66.Plus One 66(分治法))