zoukankan      html  css  js  c++  java
  • leetcode刷题笔记306题 累加数

    leetcode刷题笔记306题 累加数

    源地址:306. 累加数

    问题描述:

    累加数是一个字符串,组成它的数字可以形成累加序列。

    一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。

    给定一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是累加数。

    说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。

    示例 1:

    输入: "112358"
    输出: true
    解释: 累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
    示例 2:

    输入: "199100199"
    输出: true
    解释: 累加序列为: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199

    import scala.collection.mutable.ListBuffer
    import scala.util.control.Breaks._
    object Solution {
        def isAdditiveNumber(nums: String): Boolean = {
            def strAdd(x: String, y: String): String = {
                val A = new ListBuffer[Int]
                val B = new ListBuffer[Int]
                val C = new ListBuffer[Int]
                var t = 0
                var cur = 0
                for (i <- (0 to x.length-1).reverse) A.append(x(i) - '0')
                for (i <- (0 to y.length-1).reverse) B.append(y(i) - '0')
    
                breakable{
                while (true) {
                    if (cur < A.length || cur < B.length || t > 0){
                        if (cur < A.length) t += A(cur)
                        if (cur < B.length) t += B(cur)
                        C.append(t%10)
                        t /= 10
                        cur += 1
                    } else {
                        break()
                    }
                 }
                }
                return C.mkString.reverse
            }
    
                for (i <- 0 to nums.length-1){
                    for (j <- i+1 to nums.length-2){
                        var a = -1
                        var b = i
                        var c = j
                        breakable{
                            while (true) {
                                if (b-a > 1 && nums(a+1) == '0' || c-b > 1 && nums(b+1) == '0') break()
                                val x = nums.substring(a+1, b+1)
                                val y = nums.substring(b+1, c+1)
                                val z = strAdd(x, y)
                                //println("------------------------------")
                                //println("a: " + a +", b: "+ b + ", c: " + c)
                                //println("x: " + x +", y: "+ y + ", z: " + z)
                                if (c + z.length + 1 > nums.length) break()
                                if (nums.substring(c+1, c+z.length+1) != z) break()
                                //println("success!")
                                a = b
                                b = c
                                c += z.length
                                //println("a: " + a +", b: "+ b + ", c: " + c)
                                //println("x: " + x +", y: "+ y + ", z: " + z)
                                if (c + 1 == nums.length) return true
                            }   
                        }
                    }
                }
            return false
        }
    }
    
    import (
        "fmt"
        "strconv"
    )
    func isAdditiveNumber(num string) bool {
        for i := 0; i < len(num); i++ {
            for j := i+1; j+1 < len(num); j++ {
                a := -1
                b := i
                c := j
                //fmt.Printf("a: %d b: %d c: %d
    ", a, b, c)
                for (true) {
                    if b-a > 1 && num[a+1] == '0' || c-b > 1 && num[b+1] == '0' {break}
                    x := num[a+1:b+1]
                    y := num[b+1:c+1]
                    z := StrAdd(x, y)
                    //fmt.Printf("x: %s y: %s z: %s
    ",x, y, z)
                    if c + 1 + len(z) > len(num) {break}
                    if num[c+1: c+1+len(z)] != z {break}
                    a = b
                    b = c 
                    c += len(z)
    
                    if c + 1 == len(num) {return true}
                }
            }
        }
        return false
    }
    
    func StrAdd(str1 string, str2 string) string {
        var A = []int{}
        var B = []int{}
        var C = []int{}
    
        for i := len(str1)-1; i >= 0; i-- {
            temp, _ := strconv.Atoi(string(str1[i]))
            A = append(A, temp)
        }
        for i := len(str2)-1; i >= 0; i-- {
            temp, _ := strconv.Atoi(string(str2[i]))
            B = append(B, temp)
        }
    
        for i, t := 0, 0; i < len(A) || i < len(B)|| t > 0; i++ {
            if i < len(A) {t += A[i]}
            if i < len(B) {t += B[i]}
            C = append(C, t%10)
            t /= 10
            //fmt.Printf("i: %d, A[i]: %d, B[i]: %d
    ", i, A[i], B[i])
        }
    
        res := ""
        for i := len(C)-1 ; i >= 0; i-- {
            //fmt.Printf("i: %d, C[i]: %d
    ", i, C[i])
            res += strconv.Itoa(C[i])
        }
        //fmt.Printf("res: %s
    ", res)  
        return res
    }
    
  • 相关阅读:
    bzoj1731 [Usaco2005 dec]Layout 排队布局
    loj10087 Intervals
    差分约束小结
    bzoj1112 [POI2008]砖块Klo
    bzoj3524 [POI2014]Couriers
    poj2752 Seek the Name, Seek the Fame
    1027C Minimum Value Rectangle
    bzoj2212 [POI2011]Tree Rotations
    bzoj3747 [POI2015]Kinoman
    628D Magic Numbers
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/14058627.html
Copyright © 2011-2022 走看看