算法练习:加一【2021-10-18】

4.加一

4.1、题目描述

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

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

你可以假设除了整数 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]

提示:

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

4.2、解法

标签:数组遍历

思路: 这道题需要整理出来有哪几种情况,在进行处理会更舒服 末位无进位,则末位加一即可,因为末位无进位,前面也不可能产生进位,比如 45 => 46 末位有进位,在中间位置进位停止,则需要找到进位的典型标志,即为当前位 %10后为 0,则前一位加 1,直到不为 0 为止,比如 499 => 500 末位有进位,并且一直进位到最前方导致结果多出一位,对于这种情况,需要在第 2 种情况遍历结束的基础上,进行单独处理,比如 999 => 1000

image-20201202234554881

image-20201202234607805

image-20201202234621805

自己解法:

public class AddOne {
     public static void main ( String[] args ) {
         int[] arr = {0};
 ​
         Integer[] arrs = AddOne ( arr );
 ​
         System.out.println ( Arrays.toString ( arrs ) );
 ​
     }
 ​
     public static Integer[] AddOne(int[] arr){
 ​
         Integer result = 0;
 ​
         //利用双层循环把数组的“和”求出来
         if ( arr.length >= 1 && arr.length <= 100 ){
             for ( int i = 0 ; i < arr.length ; i++ ) {
                 for ( int j = 1 ; j <= arr.length ; j++ ) {
                     //加上限制条件  当i == j-1 时 
                     if ( arr[i]>= 0 && arr[i] <= 9 && i == (j - 1) ){
                         //Math.pow()计算10的平方
                         result += arr[i] * (int) Math.pow ( 10,arr.length - j );
                     }
                 }
             }
         }
 ​
         //把和加1
         result = result + 1;
 ​
         //把124转换为字符串
         String str = Integer.toString ( result );
 ​
         //调用toCharArray转换为字符数组
         char[] chars = str.toCharArray ( );
 ​
         //创建新的数组
         Integer[] num = new Integer[chars.length];
 ​
         //把char字符强制转换为int型再赋给num数组
         for ( int i = 0 ; i < chars.length ; i++ ) {
             num[i] = ((int) chars[i] - 48);
         }
 ​
         return num;
     }
 }

复杂度分析

  • 时间复杂度

  • 空间 复杂度

官方解法:

class Solution {
     public int[] plusOne(int[] digits) {
         int len = digits.length;
         for(int i = len - 1; i >= 0; i--) {
             digits[i]++;
             digits[i] %= 10;
             if(digits[i]!=0)
                 return digits;
         }
         digits = new int[len + 1];
         digits[0] = 1;
         return digits;
     }
 }
 ​

复杂度分析

  • 时间复杂度:O(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值