OJ练习17——T66 Plus One

用单个保存的数字表示一个十进制数,实现+1操作。

保存的第一个数一定要是有意义的(非零)。

【思路】

很容易想到把保存的数字转换为实际十进制数,然后+1,再按原格式保存,但很明显有超范围数据如何表示的问题。

比如9876543210.(试过用long long类型也放不下?)

所以要考虑几种情况:

1.个位数字不是9,直接在个位数+1;

2.个位数字是9,对于数据位数>1的,从后向前遍历每位数,遇到不是9的就+1,break;

在此之前是9的就变0。

如果改变后最大位是0,则最大位变1,再在最后push_back一个0;

3.如果只有一位数且是9,则变1,0. 这种情况是运行后增加的。开始容易忽略。

【my code】

vector<int> plusOne(vector<int>& digits) {
    int n=digits.size();
    if(digits[n-1]!=9)
        digits[n-1]++;
    else
    {
    for(int i=n-1; i>=0; i--){
        if(digits[i]!=9){
            digits[i]++;
            break;
        }
        else
            digits[i]=0;
    }
    }

    if(digits[0]==0){
        digits[0]=1;
        digits.push_back(0);
    }
    if(n==1&&digits[0]==9)
    {
        digits[0]=1;
        digits.push_back(0);
    }
    return digits;
    }

【other code】

用另外的vector把原vector反过来保存,再从前向后判断,如果长度增1,就push_back(1)

vector<int> plusOne(vector<int> &digits) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<int> ret(digits);
        reverse(ret.begin(), ret.end());

        int flag = 1;
        for(int i = 0; i < ret.size(); i++)
        {
            ret[i] += flag;
            flag = ret[i] / 10;
            ret[i] %= 10;
        }

        if (flag == 1)
            ret.push_back(1);

        reverse(ret.begin(), ret.end());

        return ret;
    }

评价:人家的代码总是很短_(:зゝ∠)_ 不过我的那个循环还是可读性很强的!握拳】

ps:

今天做的两道题目都很不顺畅,今天的状态也很不正常╮(╯﹏╰)╭

时间: 2024-11-04 00:19:39

OJ练习17——T66 Plus One的相关文章

AnimeGAN输出日志

D:\MyFiles\LearnFiles\Code\Python\AnimeGAN\AnimeGAN>python main.py --phase train --dataset Hayao --epoch 1 --init_epoch 1D:\Users\feng_\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\framework\dtypes.py:516: FutureWarning:

17周 oj 比较大小 类模板

/*声明一个类模板,利用它分别实现两个整数. 浮点数和字符的比较,求出大数和小数. 说明:在类模板外定义各成员函数. 输入两个整数.两个浮点数和两个字符 从大到小输出两个整数.两个浮点数和两个字符 */ #include <iostream> #include <iomanip> using namespace std; template<class numtype> class Compare { public: Compare(numtype a,numtype b

17周 oj 比較大小 类模板

/*声明一个类模板,利用它分别实现两个整数. 浮点数和字符的比較,求出大数和小数. 说明:在类模板外定义各成员函数. 输入两个整数.两个浮点数和两个字符 从大到小输出两个整数.两个浮点数和两个字符 */ #include <iostream> #include <iomanip> using namespace std; template<class numtype> class Compare { public: Compare(numtype a,numtype b

nyist oj 17 单调递增最长子序列 (动态规划经典题)

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 来源 经典题目 动态规划的经典题目:好像还有好几种解法,我现在研究的

杭电OJ 2009 2014年9月24日17:18:46

求数列的和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 43851    Accepted Submission(s): 27105 Problem Description 数列的定义如下:数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和. Input 输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<

笔试题30. LeetCode OJ (17)

这个题目有意思,和生活接近,题目的意思一看就知道,应该是字符串的全排列吧.但是需要注意的是有几数字字符是没有对应的字符串的,比如'0'和'1',所以我们的输入字符串中若有他们,则将它们过滤掉.这个题我的思路是递归,因为这种类型的题目递归思路清晰明了,若要使用循环,则会形成n层循环,所以循环的思想应该被淘汰掉.我在做这个题的时候喜欢先把"多余"的东西先给它解决掉,比如'0'和'1'这两个数字,我先遍历一边digits数组,将'0'和'1'过滤掉,这样在后面的递归中可以少考虑一些东西,自认

LeetCode OJ - Sum Root to Leaf Numbers

这道题也很简单,只要把二叉树按照宽度优先的策略遍历一遍,就可以解决问题,采用递归方法越是简单. 下面是AC代码: 1 /** 2 * Sum Root to Leaf Numbers 3 * 采用递归的方法,宽度遍历 4 */ 5 int result=0; 6 public int sumNumbers(TreeNode root){ 7 8 bFSearch(root,0); 9 return result; 10 } 11 private void bFSearch(TreeNode ro

LeetCode OJ - Longest Consecutive Sequence

这道题中要求时间复杂度为O(n),首先我们可以知道的是,如果先对数组排序再计算其最长连续序列的时间复杂度是O(nlogn),所以不能用排序的方法.我一开始想是不是应该用动态规划来解,发现其并不符合动态规划的特征.最后采用类似于LRU_Cache中出现的数据结构(集快速查询和顺序遍历两大优点于一身)来解决问题.具体来说其数据结构是HashMap<Integer,LNode>,key是数组中的元素,所有连续的元素可以通过LNode的next指针相连起来. 总体思路是,顺序遍历输入的数组元素,对每个

LeetCode OJ - Surrounded Regions

我觉得这道题和传统的用动规或者贪心等算法的题目不同.按照题目的意思,就是将被'X'围绕的'O'区域找出来,然后覆盖成'X'. 那问题就变成两个子问题: 1. 找到'O'区域,可能有多个区域,每个区域'O'都是相连的: 2. 判断'O'区域是否是被'X'包围. 我采用树的宽度遍历的方法,找到每一个'O'区域,并为每个区域设置一个value值,为0或者1,1表示是被'X'包围,0则表示不是.是否被'X'包围就是看'O'区域的边界是否是在2D数组的边界上. 下面是具体的AC代码: class Boar