包含 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 位数字的主要内容,如果未能解决你的问题,请参考以下文章