LeetCode 66 Plus One(加一)(vector)

简介: 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50564455 翻译给定一个以一系列数字表示的非负数,将其加一并转换成数字。
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50564455

翻译

给定一个以一系列数字表示的非负数,将其加一并转换成数字。

数字存储的最高位在列的最前面。

原文

Given a non-negative number represented as an array of digits, plus one to the number.

The digits are stored such that the most significant digit is at the head of the list.

分析

一看到这个题目我就想起来前面做过的一道关于求出一个数中包含的所有数字的题目,然后这里就用了这个方法。

首先将vector中的数字组合成数,然后对这个数进行加一操作,然后将这个数转换成vector的形式存储。

    int powTen(int num, int times) {
        for (int i = 0; i < times; ++i) {
            num *= 10;
        }
        return num;
    }

    int getNumFromVector(vector<int>& digits) {
        int num = 0;
        for (int i = 0; i < digits.size(); ++i) {
            num += powTen(digits[i], digits.size() - i - 1);
        }
        return num;
    }

    vector<int> getVectorFromNum(int num) {
        vector<int> v;
        stack<int> s;
        while (num >= 10) {
            s.push(num % 10);
            num /= 10;
        }
        s.push(num);
        while (!s.empty()) {
            v.push_back(s.top());
            s.pop();
        }
        return v;
    }

    vector<int> plusOne(vector<int>& digits) {
        int num = getNumFromVector(digits);
        num += 1;
        return getVectorFromNum(num);
    }

然而后来发现并不能通过,于是将int改成了long,改来改去还是不信,好吧题意不希望我这样写吧……没事,那就改,有的是思路。

具体代码见后文,首先对vector的最后一个数字进行加1操作。然后再开始遍历,并判断是否大于10,进行相应的操作。Ok,这里能做的都做了。

最后如果第一个数字是9然后加上1变成了10,或者其他大于10的情况,就启用了下面的if判断,这个占了整个代码的一半。因为需要对整个vector进行重组。其实我反而觉得这种方法写起代码来比较简单,只不过不太好直观地了解,所以我还是更喜欢上面的代码,即便不符合题目的用意,但是毕竟更加的抽象。

代码

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        digits[digits.size() - 1] += 1;
        for (int i = digits.size() - 1; i > 0; --i) {
            if (digits[i] >= 10) {
                digits[i] -= 10;
                digits[i - 1] += 1;
            }
        }
        if (digits[0] >= 10) {
            vector<int> newVec;
            newVec.push_back(digits[0] - 9);
            digits[0] -= 10;
            for (auto i : digits) {
                newVec.push_back(i);
            }
            return newVec;
        }
        return digits;
    }
};
目录
相关文章
Leetcode 623. Add One Row to Tree
题目很简单,在树的第d层加一层,值为v。递归增加一层就好了。代码如下
46 0
LeetCode Contest 178-1368. 使网格图至少有一条有效路径的最小代价 Minimum Cost to Make at Least One Valid Path in a Grid
LeetCode Contest 178-1368. 使网格图至少有一条有效路径的最小代价 Minimum Cost to Make at Least One Valid Path in a Grid
LeetCode 233. Number of Digit One
给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
89 0
LeetCode 233. Number of Digit One
|
存储 Python
LeetCode 66. Plus One
给定表示非负整数的非空数字数组,加上整数的1。 存储数字使得最高有效数字位于列表的开头,并且数组中的每个元素包含单个数字。 您可以假设整数不包含任何前导零,除了数字0本身。
91 0
LeetCode 66. Plus One
|
存储 C语言 C++
Leetcode17. 电话号码的字母组合:递归树深度遍历(C++vector和string的小练习)
Leetcode17. 电话号码的字母组合:递归树深度遍历(C++vector和string的小练习)
|
存储 算法
LeetCode 66. 加一 Plus One
LeetCode 66. 加一 Plus One
LeetCode1290 二进制链表转整数C++解法(vector实现)
给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例1:
102 0
LeetCode1290 二进制链表转整数C++解法(vector实现)
【LeetCode剑指offer57 II】和为s的连续正数序列(用vector模拟滑动窗口)
因为找的是连续子序列(并且题目的原序列是从小到大元素排列)的和为target,所以使用滑动窗口,如果加上当前元素后sum满足条件则push_back
129 0
【LeetCode剑指offer57 II】和为s的连续正数序列(用vector模拟滑动窗口)
|
算法
LeetCode 202 Happy Number(开心数)(vector、unordered_set)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50541011 翻译 写一个算法来决定一个数是否是“开心”的。
1028 0
|
测试技术
LeetCode 217 Contains Duplicate(包含重复数字)(Vector、hash)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50504102 翻译 给定一个整型数字数组,找出这个数组是否包含任何重复内容。
1066 0