【发布时间】:2019-11-11 08:59:06
【问题描述】:
我在一场在线编程竞赛中苦苦挣扎,该竞赛要求我获取数字字符串输入的所有子字符串的总和,当时我遇到了与内存相关的异常。
例如,对于“123”的输入,所需的输出是“164”。 https://www.hackerrank.com/challenges/sam-and-substrings/problem
这个问题看起来很简单,我想出了一个动态编程解决方案。 我所做的是一种自下而上的方法,它获取所有子字符串并将它们添加在一起。
我认为解决方案本身是正确的,因为它通过了超过 50% 的测试用例。这是我的简单解决方案:
static int substrings(string n)
{
decimal totalSubstring = 0;
for (var i = 0; i < n.Length; i++)
{
for (var j = 1; j <= n.Length - i; j++)
{
var strNumber = n.Substring(i, j);
decimal number = Convert.ToDecimal(strNumber);
totalSubstring = totalSubstring + (number);
}
}
return (int)(totalSubstring % 1000000007);
}
但是,当它接收到一个长字符串(例如一个超过 6426 个字符的字符串)时,没有原始类型可以保存长转换后的子字符串。
我知道这个错误听起来完全合乎逻辑,但我不知道如何处理长字符串。
请注意,我不是在寻找确切的答案,我想自己解决问题。如果有人可以给我提示或告诉我是否可以修复此解决方案,我会很高兴。
谢谢
【问题讨论】:
-
也许使用BigInteger而不是
decimal。 -
必须有一个更简单的解决方案。听说有C语言的开发者针对类似问题量身定做了解决方案!你有什么想法吗?
-
我怀疑会有一个更简单的解决方案来处理超过 6K 位的数字!
-
@MatthewWatson 问题请求是返回模 10^9 + 7