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)
}

原文地址:https://www.cnblogs.com/dennis-wong/p/9410603.html

时间: 2024-08-01 01:02:24

golang刷Leetcode系列 --- 加1的相关文章

golang刷Leetcode系列 --- 实现strStr()

实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返回  -1. 示例 1: 输入: haystack = "hello", needle = "ll" 输出: 2 示例 2: 输入: haystack = "aaaaa", needle = "bba" 输出: -1 说明: 当 

用golang刷LeetCode

用golang刷LeetCode 用Go语言刷LeetCode记录,只是为了练习Go语言,能力有限不保证都是最优解,只能在此抛转引玉了. 数据结构和算法 数据结构和算法是程序员的命根子,没了命根子也就没有了尊严. 1. 两数之和 题目描述 力扣(LeetCode)链接 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums

刷LeetCode的正确姿势——第1、125题

最近刷LeetCode比较频繁,就购买了官方的参考电子书 (CleanCodeHandbook),里面有题目的解析和范例源代码,可以省去非常多寻找免费经验分享内容和整理这些资料的时间.惊喜的是,里面的所有源代码都是用java语言写的. 接下来的一段时间里,我会将里面的大部分内容翻译成中文,再加上一些小y自己的解法和扩展内容,以博客的形式发在博客园.我想,这会是一件非常有趣的事情. 以下是翻译的前言部分,第1.4题以及其解析部分. 前言: 嗨,各位刷LeetCode的小伙伴们. 就像你们看到这本书

[LeetCode系列]括号生成问题

给定n, 返回所有匹配的n对括号的可能形式. 如 给定 n = 3, 一个解集是: "((()))", "(()())", "(())()", "()(())", "()()()" 本题解法的思路是 使用栈seq保存经历的字符串状态; 使用栈valid保存对应的字符串中有效的括号对个数; 当seq不为空时(即回溯未结束): 当前的字符串和其中有效的括号对个数分别出栈; 1. 如果字符串长度等于待求解的长度,

我也来刷LeetCode——0、Maximum Depth of Binary Tree(开篇)

作为一个非科班出身的程序员,还是很有必要刷刷题的.之前有个大牛说,菜鸟刷题可以从AC率高的刷起,这样可以快速培养信心.将LeetCode的题目按照AC率从高到低排序,第一道题目为 [Maximum Depth of Binary Tree]. 从题目就可以看出,是求二叉树的最大深度.深度的概念,是指从根节点到叶子节点的这条路径上的总节点数. 要求二叉树的最大深度,只需要求出左子树的深度和右子树的深度,取两者最大值再加 1 ,即为二叉树的最大深度. 若该二叉树为空,返回 0 . 然后就是将算法翻译

初刷LeetCode的感受

自从上个月进入实验室的云安全项目组后,因为要接触到实际的代码,在实验室博士的建议下我们项目组的硕士开始刷LeetCode练习编程能力,保持每周抽空刷几道算法题.虽然刷的不多,到现在一共只刷了不到30题,但在刷题的过程中还是有很多感触的. 实验室的博士建议我们按照题目的难易顺序循序渐进由易到难来刷,我也就照做了.因为前段时间在系统地学Python语言,所以我主要用的是Python语言来做,有的题目也采用了C/C++.Java甚至C#多种语言来尝试.在刷题的过程中,总结了自己的一些问题: 1. 对于

[LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析

本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉排序树. 举个栗子,给定 n = 3, 共有 5 个. 1 3 3 2 1 \ / / / \ 3 2 1 1

golang的leetcode之路

对于leetcode,我有一种不知名的情绪.在我看来,Leetcode是一个对于算法正确性的在线评测系统OJ,作为ACMER,大家都明白这两个字母的含义.作为一个曾经的ACMER,在学校时接触的是各类算法和数据结构,也曾经奋斗过,也曾经失落过,也曾经辉煌过,也曾经低沉过.不管怎么样,我和算法和OJ结下了不解之缘. 为此在这新的开始来临时,我决定用golang在leetcode上进行一番书写,我将再次在这里记录我的足迹,我的奋斗,我的汗水以及我已经逝去的青春.这里先对golang打个广告,这门语言

Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付)

http://www.cnblogs.com/devinlee/p/4565933.html Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付) 关注作者的微信公众平台,测试效果 包含微信公众平台的所有功能(除微支付) 示例代码:(如需要全部代码,请加作者微信:Leedege) 复制代码 function UpNews(Num: Integer; AccessToken: String): String; var J: TJSONObject; N: