zoukankan      html  css  js  c++  java
  • 【嘎】数组-加一

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

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

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

    示例 1:

      输入: [1,2,3]
      输出: [1,2,4]
      解释: 输入数组表示数字 123。
    示例 2:

      输入: [4,3,2,1]
      输出: [4,3,2,2]
      解释: 输入数组表示数字 4321。

    解答: step1 一开始用了int接收origin,后来用了long,但还是会有溢出的问题,所以这种做法是不对的

     1 class Solution {
     2     public int[] plusOne(int[] digits) {
     3         long origin = 0L;
     4         for (int i = 0; i < digits.length; i++) {
     5             origin = (origin * 10) + digits[i];
     6         }
     7         String res = (origin + 1) + "";
     8         int arr[] = new int[res.length()];
     9         for (int i = 0; i < res.length(); i++) {
    10             arr[i] = Integer.parseInt(res.charAt(i) + "");
    11         }
    12         return arr;
    13     }
    14 }

    然后换成了下面的写法,其中错了两次,忘记会有进位了:

     1 class Solution {
     2     public int[] plusOne(int[] digits) {
     3         int plus = 1;
     4         for (int i = digits.length - 1; i >= 0;i--) {
     5             if (digits[i] <= 8) {
     6                 if (plus == 1) {
     7                     digits[i] = digits[i] + plus;
     8                     break;
     9                 } else {
    10                     break;
    11                 }
    12             } else {
    13                 digits[i] = 0;
    14                 plus = 1;
    15                 // 错误1:[9],需要进位的,数组长度要加一
    16                 if (i == 0) {
    17                     int[] res = new int[digits.length + 1];
    18                     res[0] = 1;
    19                     for (int j = 1;j < res.length; j++) {
    20                         res[j] = digits[j-1];
    21                     }
    22                     // 错误2:忘记返回了
    23                     return res;
    24                 }
    25             }
    26         }
    27         return digits;
    28     }
    29 }

    然后看看别人的写法以及别人的评价,我突然觉得数组长度加一,for循环塞值是多余的了 : )

     下面这位精选:

    根据题意加一,没错就是加一这很重要,因为它是只加一的所以有可能的情况就只有两种:
    
    除 99 之外的数字加一;
    数字 99。
    加一得十进一位个位数为 00 加法运算如不出现进位就运算结束了且进位只会是一。
    
    所以只需要判断有没有进位并模拟出它的进位方式,如十位数加 11 个位数置为 00,如此循环直到判断没有再进位就退出循环返回结果。
    
    然后还有一些特殊情况就是当出现 9999、999999 之类的数字时,循环到最后也需要进位,出现这种情况时需要手动将它进一位。
    
    Java
    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;
        }
    }

     

    越努力越幸运~ 加油ヾ(◍°∇°◍)ノ゙
  • 相关阅读:
    Win7 IE11无法打开的可能解决办法
    s​q​l​ ​s​e​r​v​e​r​ ​2​0​0​0​登​录​名​与​数​据​库​用​户​名​的​关​联​问​题
    错误 0xc0202049: 数据流任务 1: 无法在只读列“ID”中插入数据
    清空SQL Server数据库中所有表数据的方法
    01-鼠标点击空白处实现层隐藏
    01-artDialog4.1.7常用整理
    ASP.NET MVC HtmlHelper用法大全
    随机生成十个数 填充数组
    字串加密、解密
    动手动脑、String类函数的使用说明
  • 原文地址:https://www.cnblogs.com/utomboy/p/12449475.html
Copyright © 2011-2022 走看看