【发布时间】:2019-10-28 14:30:13
【问题描述】:
我目前的任务是编写一个程序,从<2;36> 的区间计算任何基数的回文数。问题是我的解决方案的时间复杂度最多为O(n^2),也就是说,如果我坦率地说,真的很慢。
到目前为止,我尝试了一些简单的解决方案,例如将所有数字从区间转换为所需的基数,将数字转换为数组,然后一一检查每个元素。
这是我到目前为止所得到的:
int isTrue = 1;
int arr[64];
while(n > 0)
{
arr[counter] = n % base;
n = n / base;
counter++;
}
for(int i = 0; i < counter; i ++)
{
if(arr[i] != arr[counter - i - 1])
{
isTrue = 0;
break;
}
}
这无论如何都不好,但它确实适用于基本测试。问题是我目前正在尝试解决适用于更大数字的奖金之一。
我指的是跨越数十亿个数字的区间,其中一个输入是例如:
c 15 62103360044 155888062462
Result : 123502
其中 c 是程序应该执行的任务(有选项 l 列出了在奖励测试中不会出现的所有回文),15 是基数,另外两个数字是间隔的限制。
我应该在一秒钟内数出五个这样的间隔的回文,老实说,我很困惑。
如果我的问题格式错误或过于冗长,我将不胜感激 - 这是我第一次在这里提出问题。
【问题讨论】:
-
不到一秒和
O(log n)是不同的要求。你有哪个? -
不到一秒
-
那么标题中的内容是什么?删除它,因为它看起来不真实。
-
无论如何,您宁愿通过迭代数字的前半部分来生成一个回文列表 - 自然后半部分将是相同的数字反转。因此,如果您稍微考虑一下,您甚至可能会想出一个花费大约零时间的分析解决方案。
-
重新“逐一检查每个元素”:什么?不。如果间隔是十进制,从 100000 到 999,999,那么正好有 900 个回文。您不需要单独计算它们。如果前三位数字是 100,则有一个以这种方式开始的回文数,即 100,001。对于 101,还有一个:101,101。如果基数是 16,那么从 100,000 到以 16 为基数的 FFF,FFF,有 F00(以 16 为基数)回文串(十进制 3840)。您需要做的是弄清楚如何以不规则的间隔(如 1234 到 6972)计算回文数,而不是单独计算。
标签: c optimization palindrome base