以下代码适用于https://www.testdome.com/for-developers/solve-question/9780
中给出的测试样本问题是:实现inspect_bits函数,该函数检查给定数字是否在其二进制表示中包含2个或更多个连续的。如果是,则该函数应返回1.否则,它应返回0.
例如,inspect_bits(13)应返回1,因为它在其二进制表示(1101)中包含2个连续的。
我的代码是:
#include <stdlib.h>
#include <stdio.h>
int inspect_bits(unsigned int number)
{
unsigned int ref = 1;
int comp;
for (int i = 0; i< sizeof(number) * 8; i++)
{
int a = number& (ref << i);
printf("%d: a is %d\n", i, a);
int b = number& (ref << (i + 1));
printf("%d: b is %d\n", i, b);
if ((a != 0) && (b != 0))
{
return 1;
}
}
return 0;
}
#ifndef RunTests
int main()
{
printf("%d", inspect_bits(13));
}
#endif
结果似乎没问题,但系统告诉: 各种数字:错误答案
你能帮忙修改我的代码吗?
此致
答案 0 :(得分:1)
说实话,我认为这是测试网站本身的问题。您的代码会为每个给定的测试用例返回正确的结果,我甚至修改了代码:
int inspect_bits(unsigned int number)
{
for (int i = 0; i < sizeof(number) * 8; ++i) {
if (((number & (1 << i)) != 0) && ((number & (1 << (i + 1))) != 0)) {
return 1;
}
}
return 0;
}
测试用例返回1,其中有2个二进制值在一起,适用于3及以上;但是,在测试站点上运行此代码,它会出现各种数字测试失败的错误。
有趣的是,使用此代码:
int inspect_bits(unsigned int number)
{
while (number >= 3) {
if ((number & 3) == 3) { return 1; }
number >>= 1;
}
return 0;
}
这基本上是一回事,只对一个数字使用位移,测试通过100%..
您可以提交电子邮件解释错误;但除此之外,我不确定它还能是什么。
希望有所帮助。
答案 1 :(得分:0)
int flag = 0;
int inspect_bits(unsigned int number)
{
int *arr;
int i = 0;
number = convert(number);
while(number)
{
arr[i] = number % 10;
number /= 10;
i++;
}
for(int j = 0; j < i-1; j++)
{
if(arr[j] == arr[j+1])
{
flag = 1;
return flag;
}
}
return flag;
}
int convert (int num)
{
if(num == 0)
{
return 0;
}
else
{
return (num % 2 + 10 * convert(num / 2));
}
}
这就是我所做的,它说的是“各种单词:错误答案”。测试站点似乎有问题。他们网站上的其他一些问题对问题的评价不正确。我遇到的都是C程序。根据我的经验,C ++可以很好地工作。
答案 2 :(得分:0)
根据我在testdome中的经验,几乎所有的运动权解决方案都与算法的效率有关
此代码对我有用:
#include <stdlib.h>
#include <stdio.h>
int inspect_bits( unsigned int number ) {
do {
if( ( number&3 )==3 ) return 1;
} while( number>>=1 );
return 0;
}
#ifndef RunTests
int main () {
printf( "%d", inspect_bits( 13 ) );
}
#endif
在发布的代码中,for循环检查函数输入参数'number'中的所有位。效率还不够。
关键是我们不必等到完整的数字完全右移。
他们说,我们必须检查其二进制表示中是否有2个或更多连续的位,换句话说,如果找到至少2个连续的位,且值为1,则函数返回1,而较少的值连续2个位是十进制3(3 = 0b00000011)。
因此,我们可以使用与门将数字与3进行比较,然后将其右移至“数字”进行检查,直到它发生为止。
让我们使用与示例中不同的数字:
221 = 0b11011101 we just only need to compare 3 times and shift it 2 times. 0b11011101 (221) & 0b00000011 ( 3) ------------------ = 0b00000001 ( 1) 0b11011101(221) >> 1 = 0b01101110(110)
0b01101110 (110) & 0b00000011 ( 3) ------------------ = 0b00000010 ( 2) 0b01101110(110) >> 1 = 0b00110111(55) 0b00110111 (55) & 0b00000011 ( 3) ------------------ = 0b00000011 ( 3) ----> FOUND! return 1