热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将字符串数字拆分成单个数字_【LeetCode】842.将数组拆分成斐波那契序列

【LeetCode】842.SplitArrayintoFibonacciSequence将数组拆分成斐波那契序列(Medium)(JAVA)题目描述:Givenas

【LeetCode】842. Split Array into Fibonacci Sequence 将数组拆分成斐波那契序列(Medium)(JAVA)

题目描述:

Given a string S of digits, such as S = "123456579", we can split it into a Fibonacci-like sequence [123, 456, 579].

Formally, a Fibonacci-like sequence is a list F of non-negative integers such that:

  • 0 <&#61; F[i] <&#61; 2^31 - 1, (that is, each integer fits a 32-bit signed integer type);

  • F.length >&#61; 3;

  • and F[i] &#43; F[i&#43;1] &#61; F[i&#43;2] for all 0 <&#61; i Also, note that when splitting the string into pieces, each piece must not have extra leading zeroes, except if the piece is the number 0 itself.

Return any Fibonacci-like sequence split from S, or return [] if it cannot be done.

Example 1:

Input: "123456579"
Output: [123,456,579]

Example 2:

Input: "11235813"
Output: [1,1,2,3,5,8,13]

Example 3:

Input: "112358130"
Output: []
Explanation: The task is impossible.

Example 4:

Input: "0123"
Output: []
Explanation: Leading zeroes are not allowed, so "01", "2", "3" is not valid.

Example 5:

Input: "1101111"
Output: [110, 1, 111]
Explanation: The output [11, 0, 11, 11] would also be accepted.

Note:

  • 1 <&#61; S.length <&#61; 200

  • S contains only digits.

题目大意

给定一个数字字符串 S&#xff0c;比如 S &#61; "123456579"&#xff0c;我们可以将它分成斐波那契式的序列 [123, 456, 579]。

形式上&#xff0c;斐波那契式序列是一个非负整数列表 F&#xff0c;且满足&#xff1a;

  • 0 <&#61; F[i] <&#61; 2^31 - 1&#xff0c;(也就是说&#xff0c;每个整数都符合 32 位有符号整数类型)&#xff1b;

  • F.length >&#61; 3&#xff1b;

  • 对于所有的0 <&#61; i

另外&#xff0c;请注意&#xff0c;将字符串拆分成小块时&#xff0c;每个块的数字一定不要以零开头&#xff0c;除非这个块是数字 0 本身。

返回从 S 拆分出来的任意一组斐波那契式的序列块&#xff0c;如果不能拆分则返回 []。

解题方法

  1. 首先要看清楚例子&#xff0c;将数组拆分成斐波那契序列&#xff1a;数组里的每个元素不一定是相等的

  2. 所以要从第一个数字长度 i 从 1 到 S.length() / 2&#xff0c;第二个长度 j 也从 1 到 S.length() / 2&#xff0c;因为要满足至少三个&#xff0c;而且三个数字肯定大于前两个数组所以, S.length() - i - j >&#61; Math.max(i, j)

  3. 判断第三个是否是前两个的和&#xff0c;从 i &#43; j 位开始&#xff0c;判断接下来的部分是否 num1 &#43; num2 (我这里直接用的 string 的 startWith 方法&#xff0c;判断的方法很多)

  4. 后面不断循环&#xff0c;看是否能到能把所有字符判断完

  5. note: 这里还有很多可以优化的地方&#xff1a;1、可以不用创建新的字符串&#xff0c;这样可以节省空间&#xff0c;也不用 delete 字符&#xff1b;2、比较可以不用 startWith 方法&#xff0c;可以一个个 char 比较

class Solution {
    public List splitIntoFibonacci(String S) {List list &#61; new ArrayList<>();int max &#61; S.length() / 2;for (int i &#61; 1; i <&#61; max; i&#43;&#43;) {
            long num &#61; Long.parseLong(S.substring(0, i));if (num >&#61; Integer.MAX_VALUE) break;if (S.charAt(0) &#61;&#61; &#39;0&#39; && i > 1) continue;for (int j &#61; 1; j <&#61; max && (S.length() - i - j) >&#61; Math.max(i, j); j&#43;&#43;) {if (S.charAt(i) &#61;&#61; &#39;0&#39; && j > 1) continue;
                StringBuilder sb &#61; new StringBuilder(S);num &#61; Long.parseLong(S.substring(0, i));
                list &#61; new ArrayList<>();
                list.add((int) num);num &#61; Long.parseLong(S.substring(i, i &#43; j));if (num >&#61; Integer.MAX_VALUE) break;
                list.add((int) num);
                sb.delete(0, i &#43; j);while (sb.length() > 0) {int size &#61; list.size();num &#61; list.get(size - 1) &#43; list.get(size - 2);if (num >&#61; Integer.MAX_VALUE) break;if (!sb.toString().startsWith(num &#43; "")) break;
                    list.add((int) num);
                    sb.delete(0, (num &#43; "").length());
                }if (sb.length() &#61;&#61; 0 && list.size() >&#61; 3) return list;
            }
        }return new ArrayList<>();
    }
}

执行耗时:8 ms,击败了20.32% 的Java用户
内存消耗:38.7 MB,击败了66.05% 的Java用户

005381015035c6afdb8d6ad3fefc1785.png




推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
author-avatar
php送
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有