题目介绍
题干:
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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]
题解思路
首先题目中要注意的是加一和单个数字这两个点,但是很多没有想到的点还是让我踩了很多坑
首先是他不仅仅是得到的数组是单个位置的,它提供的数组也是单个数组存放的
所以你只需要再最后一项元素上加一,然后用StringBulider的append()方法得到一个完整的StringBulider再分割就可以了
注意用CharAt()方法得到的是Char类型,需要用Integer类的parseInt转成int类型存放到新数组里
但是在我以为很简单的时候,我还是忽略了一个重要的测试用例[9,9],他的答案可不是[9,1,0],而是[1,0,0]
没错,这个加一是往前递进的,不仅仅是加在最后一位,自己的理解力每次都让我失望,所以这就要在第一步加一处做修改
考虑到这种情况,原数组就不可以用了,因为肯定存在溢出的位,所以要声明新数组重新存储
用自己的方法坐下来,新声明了两个数组,三个循环结构,复杂度不用想就糟糕了,击败了5%的用户。。。。。
官方这次也没题解,不过看精选的做法确实让我钦佩,十分简洁,其实理解一样,但是人家的做法确实精炼,一起来看看
正确代码
/**
*作者:yhhzw
*链接:https://leetcode-cn.com/problems/plus-one/solution/java-shu-xue-jie-ti-by-yhhzw/
*来源:力扣(LeetCode)
*著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
class Solution {
public int[] plusOne(int[] digits) {
for (int i = digits.length - 1; i >= 0; i--) {
digits[i]++;
digits[i] = digits[i] % 10;
if (digits[i] != 0) return digits;
}
digits = new int[digits.length + 1];
digits[0] = 1;
return digits;
}
}
//也把自己臃肿的代码拿出来比较一下,看看差距
public static int[] plusOne(int[] digits) {
digits[digits.length - 1] += 1;
int[] digits1 = new int[digits.length + 1];
for (int i = 1; i < digits1.length; i++) {
digits1[i] = digits[i - 1];
}
for (int i = digits1.length - 1; i > 0; i--) {
if (digits1[i] == 10) {
digits1[i] = 0;
digits1[i - 1] += 1;
}
}
//System.out.println(Arrays.toString(digits1));
StringBuilder stringBuilder = new StringBuilder();
//转换为String类型
for (int i = 0; i < digits1.length; i++) {
if (i == 0 && digits1[0] == 0) {
continue;
}
stringBuilder.append(digits1[i]);
}
// System.out.println(stringBuilder);
// System.out.println(stringBuilder.length());
//新数组按照单个数字存储
int[] ints = new int[stringBuilder.length()];
for (int i = 0; i < stringBuilder.length(); i++) {
//将char类型转化为Int
ints[i] = Integer.parseInt(String.valueOf(stringBuilder.charAt(i)));
}
return ints;
}
总结
算法题是要一直刷的,有些问题你需要理解和自己动手实践,否则有些隐藏的条件是看不出来的
其实作为菜鸟,能用自己的方法做出来其实就已经是一件很欣慰的事情了
这道算法题没有其他重要的算法思想,就是理清思路,先想明白在写代码,这是一个好程序员都有的习惯,手撸源码的大神除外(狗头保命)
文章如果存在问题或者有更好的题解,希望大佬斧正和评论,各自努力,你我最高处见