博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode306. Additive Number
阅读量:6316 次
发布时间:2019-06-22

本文共 2088 字,大约阅读时间需要 6 分钟。

题目要求

Additive number is a string whose digits can form additive sequence.A valid additive sequence should contain at least three numbers. Except for the first two numbers, each subsequent number in the sequence must be the sum of the preceding two.For example:"112358" is an additive number because the digits can form an additive sequence: 1, 1, 2, 3, 5, 8.1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8"199100199" is also an additive number, the additive sequence is: 1, 99, 100, 199.1 + 99 = 100, 99 + 100 = 199Note: Numbers in the additive sequence cannot have leading zeros, so sequence 1, 2, 03 or 1, 02, 3 is invalid.Given a string containing only digits '0'-'9', write a function to determine if it's an additive number.

思路和代码

这里涉及一个广度优先遍历,首先尝试所有合适的第一个数字和第二个数字,然后在此基础上继续判断后序的字符串是否是一个Additive Number。

为了减少无效遍历,我们可以在寻找第一个数字和第二个数字的时候及时终止。我们可以知道第一个数字的长度不应该超过字符串长度的一般,第二个数字的长度无法超过字符串长度减去第一个数字的长度。

还有一个特殊情况是以0为开头。这里我们只有当取0时是合法的。因此一旦遇到0,在判断完0作为加数时是否合法后,直接跳出循环。

public boolean isAdditiveNumber(String num) {        if(num==null || num.length() < 3) return false;        for(int i = 1 ; i<=num.length()/2; i++){            //如果以0开头,则只能取0作为加数            if(num.charAt(0)=='0' && i>1) break;            String s1 = num.substring(0, i);            long num1 = Long.parseLong(s1);            for(int j = i+1 ; j<=num.length()-i ; j++){                //如果以0开头,则只能取0作为加数                if(num.charAt(i)=='0' && j>i+1) break;                String s2 = num.substring(i, j);                long num2 = Long.parseLong(s2);                //递归判断                if(isAdditiveNumber(num.substring(j), num1, num2)){                    return true;                }            }        }        return false;    }            private boolean isAdditiveNumber(String num, long num1, long num2){        //如果剩余长度为0,说明之前都是AdditiveNumber,返回true        if(num.length()==0) return true;        long add = num1 + num2;        String adds = add + "";        //递归判断        return num.startsWith(adds) && isAdditiveNumber(num.substring(adds.length()), num2, add);    }

clipboard.png

想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

转载地址:http://dfuaa.baihongyu.com/

你可能感兴趣的文章
[转] Entity Framework Query Samples for PostgreSQL
查看>>
软件需求分析的重要性
查看>>
UVA465:Overflow
查看>>
HTML5-placeholder属性
查看>>
Android选择本地图片过大程序停止的经历
查看>>
poj 2187:Beauty Contest(旋转卡壳)
查看>>
《Flask Web开发》里的坑
查看>>
Python-库安装
查看>>
Git笔记
查看>>
普通人如何从平庸到优秀,在到卓越
查看>>
SLAM数据集
查看>>
c#学习笔记05——数组&集合
查看>>
【图论算法】Dijstra&BFS
查看>>
注册和上传文件(头像)
查看>>
使用OVS
查看>>
键盘回收的几种方法
查看>>
Python(条件判断和循环)
查看>>
day4 linux安装python
查看>>
LeetCode Container With Most Water (Two Pointers)
查看>>
vue (v-if show 问题)
查看>>