题记:
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:
输入:digits = [0]
输出:[1]
示例 4:
输入:digits = [9]
输出:[1,0]
提示:
1 <= digits.length <= 100
0 <= digits[i] <= 9
题目来源:
作者:LeetCode
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2cv1c/
来源:力扣(LeetCode)
有问题的方法:会导致溢出
- 先将数组拼接为字符串并转化为整数
- 再将字符串转化为数组
class Solution {
//如果数组长度过长,会导致溢出,所以此方法只是提供普通参考
/**
* @param Integer[] $digits
* @return Integer[]
*/
function plusOne($digits) {
$int_string = (int)implode($digits); //将数组拼接为字符串并转化为整数 99
$int = $int_string + 1;
$result = str_split($int); //将字符串转化为数组 [1,0,0]
return $result;
}
}
$digits = [9,9];
$solution = new Solution();
$result = $solution->plusOne($digits);
print_r($result);
/**
输出结果为:
Array
(
[0] => 1
[1] => 0
[2] => 0
)
*/
官方解题方法及代码:
- 如果数组中的所有元素都是9,类似9999,加1之后肯定会变为10000,也就是数组长度会增加1位。
- 如果数组的元素只要有一个不是9,加1之后直接返回即可。
代码如下:
public int[] plusOne(int[] digits) {
int length = digits.length;
for (int i = length - 1; i >= 0; i--) {
if (digits[i] != 9) {
//如果数组当前元素不等于9,直接加1
//然后直接返回
digits[i]++;
return digits;
} else {
//如果数组当前元素等于9,那么加1之后
//肯定会变为0,我们先让他变为0
digits[i] = 0;
}
}
//除非数组中的元素都是9,否则不会走到这一步,
//如果数组的元素都是9,我们只需要把数组的长度
//增加1,并且把数组的第一个元素置为1即可
int temp[] = new int[length + 1];
temp[0] = 1;
return temp;
}
根据官方代码改编为PHP代码为:
class Solution {
/**
* @param Integer[] $digits
* @return Integer[]
*/
function plusOne($digits) {
$length = count($digits);
$temp = $digits;
for($i = $length-1; $i >=0; $i--){
if($digits[$i] != 9){
//如果数组当前元素不等于9,直接加1
//然后直接返回
$digits[$i]++;
return $digits;
}else{
//如果数组当前元素等于9,那么加1之后
//肯定会变为0,我们先让他变为0
$digits[$i] = 0;
}
}
//除非数组中的元素都是9,否则不会走到这一步,
//如果数组的元素都是9,我们只需要把数组的长度
//增加1,并且把数组的第一个元素置为1即可
if($temp[0] == 9){
array_unshift($digits,1);
}
return $digits;
}
}
$digits = [9,9,9];
$solution = new Solution();
$result = $solution->plusOne($digits);
print_r($result);
/**
Array
(
[0] => 1
[1] => 0
[2] => 0
[3] => 0
)
*/
取余解题:
1、从最后一个值进行开始遍历
2、只要是%10===0,就直接继续遍历,否则返回值即可
3、最后,遍历完还没给出结果的,那肯定是 10,这种所以要往前加1
class Solution {
/**
* @param Integer[] $digits
* @return Integer[]
*/
function plusOne($digits) {
$length = count($digits);
for($i = $length - 1; $i >=0; $i--){
$digits[$i] += 1;
$digits[$i] = $digits[$i] % 10;
if($digits[$i] !== 0){
return $digits;
}
}
array_unshift($digits,1);
return $digits;
}
}
$digits = [9,9,9];
$solution = new Solution();
$result = $solution->plusOne($digits);
print_r($result);
/**
Array
(
[0] => 1
[1] => 0
[2] => 0
[3] => 0
)
*/