Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要检查数字是否为聚合数字_Java_Algorithm_Optimization - Fatal编程技术网

Java 需要检查数字是否为聚合数字

Java 需要检查数字是否为聚合数字,java,algorithm,optimization,Java,Algorithm,Optimization,如果此数字具有以下属性,则为“聚合数字”: 就像斐波那契数一样 1,1,2,3,5,8,13 数字中的数字可以分为几个部分,后一部分是前几部分的总和 像 是否需要提供一个函数来检查此数字是否为聚合数字 我写了代码,但需要优化它。请帮忙 public class AggragetedNumber { public static void main(String[] args) { System.out.println(isAggregatedNumber("1121325")); }

如果此数字具有以下属性,则为“聚合数字”: 就像斐波那契数一样 1,1,2,3,5,8,13

数字中的数字可以分为几个部分,后一部分是前几部分的总和

是否需要提供一个函数来检查此数字是否为聚合数字

我写了代码,但需要优化它。请帮忙

public class AggragetedNumber {
  public static void main(String[] args) {
    System.out.println(isAggregatedNumber("1121325"));
}

static boolean isAggregatedNumber(String text) {
    int length = text.length() / 2;
    for (int i = 1; i <= length; i++) {
        for (int j = 2; j <= length; j++) {
            if (Match(i, j, text)) {
                return true;
            }
        }
    }
    return false;
}

static boolean Match(int i, int j, String text) {
    String first = text.substring(0, i);
    String second = text.substring(i, i * 2);
    StringBuilder buffer = new StringBuilder(first);
    buffer.append(second);
    while (buffer.length() < text.length()) {
        Integer x = (Integer.parseInt(first) + Integer.parseInt(second));
        String third = x.toString();
        buffer.append(third);
        first = second;
        second = third;
    }
    if (text.equals(buffer.toString()))
        return true;
    return false;
   }
 }
公共类加总编号{
公共静态void main(字符串[]args){
System.out.println(isAggregatedNumber(“1121325”);
}
静态布尔值isAggregatedNumber(字符串文本){
int length=text.length()/2;

对于(int i=1;i我认为关键是检查前两个数字的正确排列:

1)第一个数字的长度不应超过整个数字长度的一半

2)第一个和第二个数字的长度不应超过整个数字的长度减去第一个数字或第二个数字的长度,以较大者为准(但可以进一步优化)

publicstaticvoidmain(字符串[]args){
System.out.println(isAggregatedNumber(“111121325”);//true
System.out.println(isAggregatedNumber(“122436”);//true
System.out.println(isAggregatedNumber(“122437”);//false
System.out.println(isAggregatedNumber(“1299111210”);//true
System.out.println(isAggregatedNumber(“112112224”);//true
System.out.println(isAggregatedNumber(“112012224”);//false
}
静态布尔值isAggregatedNumber(字符串文本){
int length=text.length();

对于(int i=1;i,这里有一个优化版本,它不重复解析数字,也不使用
StringBuilder
,使其在不匹配时更快失败:

private static boolean isAggregatedNumber(String text) {
    for (int len1 = 1; len1 <= text.length() / 2; len1++) {
        int num1 = Integer.parseInt(text.substring(0, len1));
        for (int end2 = len1 + 1; end2 <= text.length() - len1; end2++) {
            int num2 = Integer.parseInt(text.substring(len1, end2));
            if (isAggregatedNumber(text, end2, num1, num2))
                return true;
        }
    }
    return false;
}
private static boolean isAggregatedNumber(String text, int start, int num1, int num2) {
    for (;;) {
        final int    num3 = num1 + num2;
        final String str3 = Integer.toString(num3);
        final int    end3 = start + str3.length();
        if (end3 > text.length())
            return false;
        if (! text.substring(start, end3).equals(str3))
            return false;
        if (end3 == text.length())
            return true;
        start = end3;
        num1 = num2;
        num2 = num3;
    }
}
使用扩展测试用例进行测试:

public static void main(String[] args) {
    System.out.println(isAggregatedNumber("00000000000000000"));   // true: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    System.out.println(isAggregatedNumber("112"));                 // true: 1,1,2
    System.out.println(isAggregatedNumber("113"));                 // false: 1,1,3
    System.out.println(isAggregatedNumber("122436"));              // true: 12,24,36
    System.out.println(isAggregatedNumber("122437"));              // false: 12,24,37
    System.out.println(isAggregatedNumber("1123581321345589144")); // true: 1,1,2,3,5,8,13,21,34,55,89,144 (fibonacci)
    System.out.println(isAggregatedNumber("5611"));                // true: 5,6,11
    System.out.println(isAggregatedNumber("1121325"));             // true: 1,12,13,25 
    System.out.println(isAggregatedNumber("111121325"));           // true: 11,1,12,13,25
    System.out.println(isAggregatedNumber("1299111210"));          // true: 12,99,111,210
    System.out.println(isAggregatedNumber("11234512346"));         // true: 1,12345,12346
    System.out.println(isAggregatedNumber("12345112346"));         // true: 12345,1,12346
    System.out.println(isAggregatedNumber("112112224"));           // true: 112,112,224
    System.out.println(isAggregatedNumber("112012224"));           // false
}

警告

在第一种方法中,对
的两个
循环进行循环优化,以防止匹配
00010000034
00010000003,4
aka
1,3,4
)。将两者都更改为
,以支持前两个数字中的前导零

更好的是,使用以下方法防止前导零:

private static boolean isAggregatedNumber(String text) {
    for (int len1 = 1; len1 < text.length() - 1; len1++) {
        int num1 = Integer.parseInt(text.substring(0, len1));
        for (int end2 = len1 + 1; end2 < text.length(); end2++) {
            int num2 = Integer.parseInt(text.substring(len1, end2));
            if (isAggregatedNumber(text, end2, num1, num2))
                return true;
            if (text.charAt(len1) == '0')
                break;
        }
        if (text.charAt(0) == '0')
            break;
    }
    return false;
}
private静态布尔值isAggregatedNumber(字符串文本){
for(int len1=1;len1
111121325-11+1=12;1+12=13;12+13=25如何,但您的程序返回FalseThank@BOND3我刚刚测试了3-4个案例,并提出了改进建议。
private static boolean isAggregatedNumber(String text, int start, int num1, int num2) {
    final int    num3 = num1 + num2;
    final String str3 = Integer.toString(num3);
    final int    end3 = start + str3.length();
    if (end3 > text.length() || ! text.substring(start, end3).equals(str3))
        return false;
    if (end3 == text.length())
        return true;
    return isAggregatedNumber(text, end3, num2, num3);
}
public static void main(String[] args) {
    System.out.println(isAggregatedNumber("00000000000000000"));   // true: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    System.out.println(isAggregatedNumber("112"));                 // true: 1,1,2
    System.out.println(isAggregatedNumber("113"));                 // false: 1,1,3
    System.out.println(isAggregatedNumber("122436"));              // true: 12,24,36
    System.out.println(isAggregatedNumber("122437"));              // false: 12,24,37
    System.out.println(isAggregatedNumber("1123581321345589144")); // true: 1,1,2,3,5,8,13,21,34,55,89,144 (fibonacci)
    System.out.println(isAggregatedNumber("5611"));                // true: 5,6,11
    System.out.println(isAggregatedNumber("1121325"));             // true: 1,12,13,25 
    System.out.println(isAggregatedNumber("111121325"));           // true: 11,1,12,13,25
    System.out.println(isAggregatedNumber("1299111210"));          // true: 12,99,111,210
    System.out.println(isAggregatedNumber("11234512346"));         // true: 1,12345,12346
    System.out.println(isAggregatedNumber("12345112346"));         // true: 12345,1,12346
    System.out.println(isAggregatedNumber("112112224"));           // true: 112,112,224
    System.out.println(isAggregatedNumber("112012224"));           // false
}
private static boolean isAggregatedNumber(String text) {
    for (int len1 = 1; len1 < text.length() - 1; len1++) {
        int num1 = Integer.parseInt(text.substring(0, len1));
        for (int end2 = len1 + 1; end2 < text.length(); end2++) {
            int num2 = Integer.parseInt(text.substring(len1, end2));
            if (isAggregatedNumber(text, end2, num1, num2))
                return true;
            if (text.charAt(len1) == '0')
                break;
        }
        if (text.charAt(0) == '0')
            break;
    }
    return false;
}