1. 题目

1.1 英文题目

Given a non-empty array of decimal digits representing a non-negative integer, increment 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 contains a single digit.

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

1.2 中文题目

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

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

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

1.3输入输出

输入 输出
digits = [1,2,3] [1,2,4]
digits = [4,3,2,1] [4,3,2,2]
digits = [0] [1]

1.4 约束条件

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9

2. 实验平台

IDE:VS2019

IDE版本:16.10.1

语言:c++11

3. 程序

3.1 测试程序

#include "Solution.h"
#include <vector> // std::vector
#include<iostream> // std::cout
using namespace std; // 主程序
void main()
{
// 输入
vector<int> digits = { 9,9,9 }; Solution solution; // 实例化Solution
vector<int> output = solution.plusOne(digits); // 主功能 // 输出
for (auto i : output)
cout << i;
}

3.2 功能程序

3.2.1 最优算法

(1)代码

#pragma once
#include<vector> // std::vector
//#include<limits.h> // INT_MIN整型最小值
#include<algorithm> // std::max
using namespace std; //主功能
class Solution {
public:
vector<int> plusOne(vector<int>& digits)
{
int carry = 1; // 存放进位数字
int length = digits.size();
for (int i = length - 1; i >= 0; --i)
{
// 若某一位没有上一位的进位,则再高位都不会再有进位,也就是说高位都保持不变,可以直接返回结果
if (carry == 0) return digits; // 若有进位,则需要计算进位值及其当前位数字,也就是需要进行循环
int sum = digits[i] + carry;
digits[i] = sum % 10;
carry = sum / 10;
} // 若是最高位还需要进位,则需要在最高位插入"1"
if (carry == 1) digits.insert(digits.begin(), 1);
return digits;
}
};

参考:https://www.cnblogs.com/grandyang/p/4079357.html

(2)解读

参考:

https://blog.csdn.net/linhuanmars/article/details/22365957

https://blog.csdn.net/Tianc666/article/details/105769411

3.2.2 直观求解法

(1)代码1

#pragma once
#include<vector> // std::vector
//#include<limits.h> // INT_MIN整型最小值
#include<algorithm> // std::max
using namespace std; //主功能
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
vector<int> digitsNew(digits.size() + 1);//新数字(逆序)
int count = 1;//进位(0/1)
for (int i = 0; i < digits.size(); i++)
{
int tempOrder = digits.size() - 1 - i;
int sumTemp = digits[tempOrder] + count;
count = sumTemp / 10;
digitsNew[i] = sumTemp % 10;+
if (i == digits.size() - 1)
digitsNew[i + 1] = count;
} // 逆序转正序
int length = digits.size() + digitsNew.back();
vector<int> digitsFinal(length);
for (int i = length - 1; i >= 0; i--)
digitsFinal[i] = digitsNew[length - 1 - i];
return digitsFinal;
}
};

(2)思路

先逆转求值,再逆转过来。但是我的代码写法不太简洁,可以参考代码2

(3)代码2

#pragma once
#include<vector> // std::vector
//#include<limits.h> // INT_MIN整型最小值
#include<algorithm> // std::max
using namespace std; //主功能
class Solution
{
public:
vector<int> plusOne(vector<int> &digits)
{
vector<int> ret(digits);
reverse(ret.begin(), ret.end()); int flag = 1;
for(int i = 0; i < ret.size(); i++)
{
ret[i] += flag;
//这里的flag的结果要么是0,要么是1
flag = ret[i] / 10;
ret[i] %= 10;
} if (flag == 1)
ret.push_back(1); reverse(ret.begin(), ret.end()); return ret;
}
};

参考:https://theonegis.blog.csdn.net/article/details/44258329

3.2.3 其他算法

(1)代码

#pragma once
#include<vector> // std::vector
//#include<limits.h> // INT_MIN整型最小值
#include<algorithm> // std::max
using namespace std; //主功能
class Solution {
public:
vector<int> plusOne(vector<int> &digits) {
int n = digits.size();
for (int i = n - 1; i >= 0; --i) {
if (digits[i] == 9) digits[i] = 0;
else {
digits[i] += 1;
return digits;
}
}
if (digits.front() == 0) digits.insert(digits.begin(), 1);
return digits;
}
};

参考:https://www.cnblogs.com/grandyang/p/4079357.html

(2)解读

将一个数字的每个位上的数字分别存到一个一维向量中,最高位在最开头,我们需要给这个数字加一,即在末尾数字加一,如果末尾数字是9,那么则会有进位问题,而如果前面位上的数字仍为9,则需要继续向前进位。具体算法如下:首先判断最后一位是否为9,若不是,直接加一返回,若是,则该位赋0,再继续查前一位,同样的方法,知道查完第一位。如果第一位原本为9,加一后会产生新的一位,那么最后要做的是,查运算完的第一位是否为0,如果是,则在最前头加一个1。

参考:https://www.cnblogs.com/grandyang/p/4079357.html

Leetcode No.66 Plus One(c++实现)的更多相关文章

  1. 【LeetCode】66 & 67- Plus One & Add Binary

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

  2. 【一天一道LeetCode】#66. Plus One

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  3. 【LeetCode】66. 加一

    66. 加一 知识点:数组: 题目描述 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 ...

  4. 【LeetCode】66. Plus One 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数九 采用进位 日期 [LeetCode] 题目地址 ...

  5. LeetCode OJ 66. Plus One

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

  6. 【LeetCode】66. Plus One

    题目: Given a non-negative number represented as an array of digits, plus one to the number. The digit ...

  7. LeetCode(66): 加一

    Easy! 题目描述: 给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会 ...

  8. 力扣(LeetCode) 66. 加一

    给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: 输入 ...

  9. 【LeetCode】66. Plus One (2 solutions)

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

  10. LeetCode第[66]题(Java):Plus One

    题目:数组加一 难度:Easy 题目内容:   Given a non-empty array of digits representing a non-negative integer, plus ...

随机推荐

  1. crontab 的简要介绍

    1.概述: crontab 用于周期性被执行的指令,该指令从标准设备输入指令,并将指令存放在crontab文件中,供之后读取和执行. 与crontab相关的文件一共有三个: /etc/crontab ...

  2. 危险!水很深,让叔来 —— 谈谈命令查询权责分离模式(CQRS)

    多年以前,那时我正年轻,做技术如鱼得水,甚至一度希望自己能当一辈子的一线程序员. 但是我又有两个小愿望想要达成:一个是想多挣点钱:另一个就是对项目的技术栈和架构选型能多有点主动权. 多挣点钱是因为当时 ...

  3. Python+Selenium学习笔记17 - HTML测试报告

    运行少量case时 1 # coding = utf-8 2 3 from selenium import webdriver 4 import unittest 5 import time 6 fr ...

  4. bat使用方法汇总

    前言 由于日常科研工作中使用C/C++比较多,在进行大规模运行时涉及到的批量处理操作较多,遂将目前遇到的情况记录如下,以便查看: 1.for循环 最基本的for循环操作为在一些数中遍历,如下例子.se ...

  5. javascript获取日期,年月,日

    <SCRIPT LANGUAGE="JavaScript"> var myDate = new Date();     myDate.getYear();       ...

  6. 降维-基于RDD的API

    降维-基于RDD的API Singular value decomposition (SVD) Performance SVD Example Principal component analysis ...

  7. 3D-LaneNet:端到端三维多车道检测ICCV2019

    3D-LaneNet:端到端三维多车道检测ICCV2019 3D-LaneNet: End-to-End 3D Multiple Lane Detection 论文链接: http://openacc ...

  8. YOLOvi(i=1,2,3,4)系列

    YOLOvi(i=1,2,3,4)系列 YOLOv4论文链接:https://arxiv.org/pdf/2004.10934.pdf YOLOv4源码链接:https://github.com/Al ...

  9. 3层-CNN卷积神经网络预测MNIST数字

    3层-CNN卷积神经网络预测MNIST数字 本文创建一个简单的三层卷积网络来预测 MNIST 数字.这个深层网络由两个带有 ReLU 和 maxpool 的卷积层以及两个全连接层组成. MNIST 由 ...

  10. TensorFlow损失函数

    TensorFlow损失函数 正如前面所讨论的,在回归中定义了损失函数或目标函数,其目的是找到使损失最小化的系数.本文将介绍如何在 TensorFlow 中定义损失函数,并根据问题选择合适的损失函数. ...