首页 > 编程语言 >#yyds干货盘点# LeetCode程序员面试金典:累加数

#yyds干货盘点# LeetCode程序员面试金典:累加数

时间:2023-11-09 23:33:52浏览次数:44  
标签:yyds secondEnd firstEnd int 金典 累加 num secondStart LeetCode

题目

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


一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和。


给你一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。


说明:累加序列里的数,除数字 0 之外,不会 以 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

代码实现


class Solution {
    public boolean isAdditiveNumber(String num) {
        int n = num.length();
        for (int secondStart = 1; secondStart < n - 1; ++secondStart) {
            if (num.charAt(0) == '0' && secondStart != 1) {
                break;
            }
            for (int secondEnd = secondStart; secondEnd < n - 1; ++secondEnd) {
                if (num.charAt(secondStart) == '0' && secondStart != secondEnd) {
                    break;
                }
                if (valid(secondStart, secondEnd, num)) {
                    return true;
                }
            }
        }
        return false;
    }

    public boolean valid(int secondStart, int secondEnd, String num) {
        int n = num.length();
        int firstStart = 0, firstEnd = secondStart - 1;
        while (secondEnd <= n - 1) {
            String third = stringAdd(num, firstStart, firstEnd, secondStart, secondEnd);
            int thirdStart = secondEnd + 1;
            int thirdEnd = secondEnd + third.length();
            if (thirdEnd >= n || !num.substring(thirdStart, thirdEnd + 1).equals(third)) {
                break;
            }
            if (thirdEnd == n - 1) {
                return true;
            }
            firstStart = secondStart;
            firstEnd = secondEnd;
            secondStart = thirdStart;
            secondEnd = thirdEnd;
        }
        return false;
    }

    public String stringAdd(String s, int firstStart, int firstEnd, int secondStart, int secondEnd) {
        StringBuffer third = new StringBuffer();
        int carry = 0, cur = 0;
        while (firstEnd >= firstStart || secondEnd >= secondStart || carry != 0) {
            cur = carry;
            if (firstEnd >= firstStart) {
                cur += s.charAt(firstEnd) - '0';
                --firstEnd;
            }
            if (secondEnd >= secondStart) {
                cur += s.charAt(secondEnd) - '0';
                --secondEnd;
            }
            carry = cur / 10;
            cur %= 10;
            third.append((char) (cur + '0'));
        }
        third.reverse();
        return third.toString();
    }
}


标签:yyds,secondEnd,firstEnd,int,金典,累加,num,secondStart,LeetCode
From: https://blog.51cto.com/u_13321676/8286311

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:供暖器
    题目冬季已经来临。你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。在加热器的加热半径范围内的每个房屋都可以获得供暖。现在,给出位于一条水平线上的房屋houses和供暖器heaters的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。注意:所有供暖器heaters......
  • LeetCode-88题合并两个有序数组
    给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应......
  • # yyds干货盘点 # Python自动化办公——3个Excel表格中每个门店物品不同,想要汇总在一
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公处理的问题,一起来看看吧。上一篇文章中,我们已经看到了四种解决办法了,这一篇文章我们一起来看看另外一种方法。二、实现过程这里【论草莓如何成为冻干莓】给了unstack()操作的方法,代码如下......
  • LeetCode #1131 Maximum of Absolute Value Expression 绝对值表达式的最大值
    安装Flutter环境首先配置flutter3开发环境,照着官方教程傻瓜式安装即可。>>安装和环境配置|Flutter中文文档|Flutter中文开发者网站注意在国内网络环境下需要进行一些额外的环境配置:>>在中国网络环境下使用Flutter|Flutter中文文档|Flutter中文开发者网站Description......
  • LeetCode_0042. 接雨水
    题目描述给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例示例1:输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图,在这种情况下,可以接6个单位的雨水(蓝色部分表示雨......
  • # yyds干货盘点 # 盘点一个Excel表格数据筛选的问题(中篇)
    大家好,我是皮皮。一、前言前几天有粉丝问我Excel数据筛选的问题,原始数据如下图所示,其实一开始的总学时是字符串格式,我直接在wps里边进行了批量转换为数据操作,下面一起来看看需求吧。粉丝的需求是根据原始表格,然后填充下表:二、实现过程这里其实使用Excel就可以实现,这里介绍两个方法,......
  • # yyds干货盘点 # 盘点一个Excel表格数据筛选的问题(上篇)
    大家好,我是皮皮。一、前言前几天有粉丝问我Excel数据筛选的问题,原始数据如下图所示,其实一开始的总学时是字符串格式,我直接在wps里边进行了批量转换为数据操作,下面一起来看看需求吧。粉丝的需求是根据原始表格,然后填充下表:二、实现过程这里其实使用Excel就可以实现,这里介绍两个方法,......
  • # yyds干货盘点 # pandas如何将下图这个数据格式,改为%Y-%m-%d这种格式的?
    大家好,我是皮皮。一、前言前几天在Python白银交流群【小王子】问了一个Python日期处理的问题,一起来看看吧。原始数据库中的数据如下所示:二、实现过程这里【袁学东】给了一个方法,代码如下所示:df['日期']=pd.to_datetime(df['日期']).datetime.strftime(‘%Y%m-%d’)顺利地解决了问......
  • LeetCode222.完全二叉树的节点个数
    题目描述给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~2h个节点。示例提交的代......
  • [Leetcode] 0118. 杨辉三角
    118.杨辉三角题目描述给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例1:输入:numRows=5输出:[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:输入:numRows=1输出:[[1]] 提......