zoukankan      html  css  js  c++  java
  • golang刷Leetcode系列 --- 加1

    加一

    给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。

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

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

    示例 1:

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

    示例 2:s

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

    这道题做了挺长时间, 主要是第一次的思路没有考虑到数组所表示的整数可能会溢出的情况. 傻傻的把数组转换成整数, 加1之后又转换为数组.
    所以这道题主要在于两点:

    1. 整数溢出的问题
    2. 如何处理每一位的进位的问题

    我的思路是, 设置另一个切片result存储相加之后的整数. 关于切片的长度, 是这样确定的, 如果原数组digits每一位都是9的话,
    也就是说整数最高位会产生进1, 那么result的长度就是digits长度加1. 否则, result的长度就是digits的长度.

    使用carry表示进位(0或者1). 第一步先计算digits和result的最高位, 得到一个初始的carry.

    然后使用循环计算digits和result的每一位, 每一位的进位都取决于上一位相加得到的值, 如果该值大于10, 进位=1, 否则进位=0

    
    func plusOne(digits []int) []int {
    	var carry int = 0
    	var overflow int = 0
    	var len2 int = 0
    
    	len1 := len(digits)
    	for i := 0; i < len1; i++ {
    		if digits[i] == 9 {
    			overflow++
    		}
    	}
    
    	if overflow == len1 {
    		len2 = len1 + 1
    	} else {
    		len2 = len1
    	}
    
    	result := make([]int, len2)
    
    	digits[len1-1] += 1
    	result[len2-1] = digits[len1-1] % 10
    	if digits[len1-1] >= 10 {
    		carry = 1
    	}
    	
    	for i, j := len1 - 2, len2 - 2; i >= 0 || j >= 0; {
                    //防止下标i越界
    		if i >= 0 {
    			digits[i] += carry	
    			if digits[i] >= 10 {
    				carry = 1
    			} else {
    				carry = 0
    			}
    			result[j] = digits[i] % 10
    		}
                    //当最高位需要进位时
    		if len1 < len2 && j == 0 {
    			result[j] = 1
    			break
    		}
    			
    		i--;
    		j--;
    	}
    
    	fmt.Println(result)
    
    	return result
    }
    
    func main() {
    	digits := []int{1, 2, 3}
        plusOne(digits)
    	//fmt.Println(result)
    }
    
  • 相关阅读:
    2019/10/21 动手动脑
    2019/10/21 课堂测试---向数据库添加新用户
    2019/10/14 如何在静态方法中访问类的实例成员
    2019/10/14 构造函数、默认值、初始化块的优先级。
    2019/10/14 动手动脑---
    2019/9/30 极限测试(1)
    读《程序员的修炼之道------从小工到专家》有感 1
    课堂测试,统计小说<飘>前N个最常出现的单词
    Java课堂 动手动脑
    2019/9/23 课堂测试一 回文
  • 原文地址:https://www.cnblogs.com/dennis-wong/p/9410603.html
Copyright © 2011-2022 走看看