1000位的字符串,求无数组最大的5位

String with 1000 digits, find the biggest 5 digits without an array

我知道我的代码可以更简单、更高效...我的代码应该获取最大的 5 位数字集。它有效,除了它只抓取 3 位数字,我需要修改什么才能改变它?

public class thousandDigits {
    public static void main(String[] args) {
        int greatest = 0;
        String num = ("73167176531330624919225119674426574742355349194934"
                + "96983520312774506326239578318016984801869478851843"
                + "85861560789112949495459501737958331952853208805511"
                + "12540698747158523863050715693290963295227443043557"
                + "66896648950445244523161731856403098711121722383113"
                + "62229893423380308135336276614282806444486645238749"
                + "30358907296290491560440772390713810515859307960866"
                + "70172427121883998797908792274921901699720888093776"
                + "65727333001053367881220235421809751254540594752243"
                + "52584907711670556013604839586446706324415722155397"
                + "53697817977846174064955149290862569321978468622482"
                + "83972241375657056057490261407972968652414535100474"
                + "82166370484403199890008895243450658541227588666881"
                + "16427171479924442928230863465674813919123162824586"
                + "17866458359124566529476545682848912883142607690042"
                + "24219022671055626321111109370544217506941658960408"
                + "07198403850962455444362981230987879927244284909188"
                + "84580156166097919133875499200524063689912560717606"
                + "05886116467109405077541002256983155200055935729725"
                + "71636269561882670428252483600823257530420752963450");

        for (int n = 0; n < num.length() - 5; n++) {
            greatest = ((num.charAt(n)) + (num.charAt(n+1)) + (num.charAt(n+2)) + (num.charAt(n+3))
                    + (num.charAt(n+4)));
            if (greatest > n) {
                n = greatest;
            }
        }
        System.out.print(greatest);
    }
}

输出:

357

我想你会发现不是抓取三位数,而是你抓取的六个字符之和是一个三位数。

如果您在寻找最大的五位数,则需要像 一样提取五位数(而不是六位数)并为其分配权重。所以第一个数字必须乘以 10,000,第二个数字必须乘以 1,000,依此类推。

但还有更多:您将在字符串中的索引处获取 字符。这不是您想要的,因为它与该字符的数值不同。为此你需要:

num.charAt(n) - '0'

这些更改应该允许您按原样更正算法。

一种更有效的方法是提取 5 位子字符串并将它们转换为整数。第一个是:

Integer.parseInt(num.subString(0, 5));

您可以迭代让每一个都找到最大的。

我想你想用 String.substring(int, int) to iterate all possible 5 character substrings, and then you might use Math.max(int, int) 来更新 greatest。像

int greatest = Integer.MIN_VALUE;
for (int i = 0; i < num.length() - 4; i++) {
    // int value = Integer.parseInt(num.substring(i, i + 5));
    int value = Integer.parseInt(String.valueOf(num.charAt(i))
                + num.charAt(1 + i) + num.charAt(2 + i) + num.charAt(3 + i)
                + num.charAt(4 + i));
    greatest = Math.max(greatest, value);
}
System.out.println(greatest);

我得到 99890

尽管@ElliottFrisch 和@dave 提供了更优雅的答案,但我尝试从您的原始版本进行修改,这是我的代码(我已经测试过):

public class ThousandDigits {
    public static void main(String[] args) {
        int greatest = 0;
        String num = ("73167176531330624919225119674426574742355349194934"
                + "96983520312774506326239578318016984801869478851843"
                + "85861560789112949495459501737958331952853208805511"
                + "12540698747158523863050715693290963295227443043557"
                + "66896648950445244523161731856403098711121722383113"
                + "62229893423380308135336276614282806444486645238749"
                + "30358907296290491560440772390713810515859307960866"
                + "70172427121883998797908792274921901699720888093776"
                + "65727333001053367881220235421809751254540594752243"
                + "52584907711670556013604839586446706324415722155397"
                + "53697817977846174064955149290862569321978468622482"
                + "83972241375657056057490261407972968652414535100474"
                + "82166370484403199890008895243450658541227588666881"
                + "16427171479924442928230863465674813919123162824586"
                + "17866458359124566529476545682848912883142607690042"
                + "24219022671055626321111109370544217506941658960408"
                + "07198403850962455444362981230987879927244284909188"
                + "84580156166097919133875499200524063689912560717606"
                + "05886116467109405077541002256983155200055935729725"
                + "71636269561882670428252483600823257530420752963450");

        int max = -1;
        for (int n = 0; n < num.length() - 4; n++) {
            greatest = ((num.charAt(n) - '0') * 10000 + (num.charAt(n + 1) - '0') * 1000
                    + (num.charAt(n + 2) - '0') * 100 + (num.charAt(n + 3) - '0') * 10 + (num.charAt(n + 4) - '0'));
            if (max < greatest) {
                max = greatest;
            }
        }
        System.out.print(max);
    }
}

我认为您正在尝试将 5 个连续字符相加以获得总和,并存储最高总和的起始索引。

但你应该使用 Character.getNumricValue(char) 将 (num.charAt(n)) 转换为数值然后相加。

greatest  = Character.getNumericValue((num.charAt(n)) + Character.getNumericValue((num.charAt(n+1)) + Character.getNumericValue((num.charAt(n+2)) + 
Character.getNumericValue((num.charAt(n+3)) + 
Character.getNumericValue((num.charAt(n+4));

您需要一个有效的值来存储旧值以进行比较和索引

if(greatest > oldGreatest) {
    index = n;
} 

然后最后使用 index out side loop 打印:

System.out.print((num.charAt(index)) + (num.charAt(index+1) + (num.charAt(index +2)) + (num.charAt(index +3)) + (num.charAt(index +)));