在我的业余时间里,我一直在为Interview Street挑战改变比赛现在已经有一个多星期了,而且此时只是转动我的车轮,所以我希望有人可以给我一个正确方向的指针或暗示.
挑战的基础是两个字符串A& B并运行一些操作两位字符串的查询.
设A和B为两个N位数.您将获得A和B的初始值,您应该编写一个处理三种查询的程序:
> set_a idx x:将A [idx]设置为x,其中0 <= idx< N,其中A [idx]是
idx’th最重要的一点A.
> set_b idx x:将B [idx]设置为x,其中0 <= idx< N.
> get_c idx:打印C [idx],其中C = A B,并且0 <= idx
其中位数的长度为1到100,000,并且程序可以具有set_a,set_b或get_c的任意组合的1到500,000个查询.
为了最小化循环,我使用C作为运行总计.当A或B中的位改变时,也从C加上或减去改变的位.当存在进位时,进一步最小化加法和减法时的循环从改变的位到左手.
private static void add(final boolean[] the_array, final int the_index)
{
for(int iter = the_array.length - the_index - 1; iter >= 0; iter--)
{
if(the_array[iter])
{
the_array[iter] = false;
}
else if(!the_array[iter])
{
the_array[iter] = true;
return ;
}
}
}
private static void subtract(final boolean[] the_array, final int the_index)
{
for(int iter = the_array.length - the_index - 1; iter >= 0; iter--)
{
if(the_array[iter])
{
the_array[iter] = false;
return ;
}
else if(!the_array[iter])
{
the_array[iter] = true;
}
}
}
整体而言,该程序运行良好,完成了最大边缘长度为100,000和500,000次查询在大约120ms内运行,但它仍然不够快,无法应对挑战.由于比特长度的大小快速超过Java中的原始整数(长)值,因此大多数API不适用于此.由于我没有取得多大进展,因此整体运行时间的大小开始表明可能存在一种算法或数据结构,而不仅仅是一个数组.有什么想法吗?