包含 1000 位数字的字符串,在没有数组的情况下找到最大的 5 位数字

Posted

技术标签:

【中文标题】包含 1000 位数字的字符串,在没有数组的情况下找到最大的 5 位数字【英文标题】:String with 1000 digits, find the biggest 5 digits without an array 【发布时间】:2016-02-21 03:08:09 【问题描述】:

我知道我的代码可以更简单、更高效...我的代码应该能够获取最大的 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

【问题讨论】:

您的代码不起作用。有大于 357 的 3 位数字 963。 我想你的意思是num.charAt(n+1) 不是(num.charAt(n)+1)。此外,您需要将第一个数字乘以 10^(6-n),其中 n=1 以开始每个数字 n=1...5 【参考方案1】:

我认为您想使用String.substring(int, int) 来迭代所有可能的5 个字符的子字符串,然后您可以使用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

【讨论】:

我不应该在这个程序中使用 subString,虽然我很感激帮助 @Frank 已编辑。下次请列出您的所有限制,以便更快地获得更好的帮助(您只说没有数组)。【参考方案2】:

我认为您正在尝试添加 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 侧循环打印:

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

【讨论】:

【参考方案3】:

虽然@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);
    

【讨论】:

为什么将 num.charAt 乘以 1000 得到前 2 个,然后 100 得到第三个,最后一个只有 10? @Frank 因为从您的问题来看,我相信我们找到的是最大的 5 位数字(例如 99890),而不是 5 位数字的总和(例如 9 + 9 + 8 + 9 + 0 = 35 )。因此,我们需要通过将第一个 9 视为 90000(这就是为什么将它乘以 10000),将第二个 9 视为 9000,等等来重构这个数字。这有意义吗?【参考方案4】:

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

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

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

num.charAt(n) - '0'

这些更改应该允许您更正您的算法。

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

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

您可以迭代让每个人找到最伟大的。

【讨论】:

它是substring,它是(0, n]。 Javadoc 表示(部分)子字符串从指定的beginIndex 开始并延伸到索引endIndex - 1 处的字符。

以上是关于包含 1000 位数字的字符串,在没有数组的情况下找到最大的 5 位数字的主要内容,如果未能解决你的问题,请参考以下文章

在数组的线性时间内排序,每个元素至少出现n / 1000次

SPARQL:数组字符串转换/提取

将千位分隔符添加到任何数字,即使它包含特殊字符

位运算

如何在没有指数表示法的情况下将浮点数作为字符串获取?

使用数字和千位分隔符修复格式错误的字符串