【发布时间】:2020-06-03 21:39:54
【问题描述】:
我在一次采访中得到了一个代码来编写一个函数来反转一个 32 位有符号整数,我在第三次尝试中写了这个(适用于所有测试用例):
int fun(int x)
{
char a[11]=""; //this will contain character form of absolute value of number 'x'
char b[11]=""; //this will contain reverse of absolute of number 'x'
char e[11]="";
short sign = -1;
short index_a=0;
short index_b=0;
short index_e=0;
short temp_index=0;
if(x<0)
{
sprintf(a,"%u",(unsigned int)(-1*(long int)(x)));
sprintf(e,"%u",(unsigned int)(-1*(long int)(pow(2,31)))); //setting the limits
sign = -1;
}
else if(x>0)
{
sprintf(a,"%u",(unsigned int)x);
sprintf(e,"%u",(unsigned int)(-1*(long int)(pow(2,31) - 1))); //setting the limits
sign = 1;
}
else
x=0;
index_a = strlen(a);
--index_a;
//'b' will contain the reversed digits of array 'a'
while(index_a>=0) //storing it in 'b' from a character by character in reverse order
{
b[index_b++] = a[index_a--];
}
//here index_a is equal to -1 and index_b is euqal to 'strlen(b)'
if(index_b==10) //10 is the number of digits in (2^31 - 1) or (2^31)
{
while(temp_index<index_b)
{
if(b[temp_index]>e[index_e])
return 0;
else if(b[temp_index] < e[index_e])
break;
temp_index++;
index_e++;
}
}
return sign*atoi(b);
}
我被要求改进但我不能(后来知道这个问题是为了过滤 - 我猜我失败了) - 你能建议任何其他方法吗?
我遇到的主要问题是当变量x等于-(2^31)时,这就是为什么我不能简单地写x = abs(x)-您能否还建议我一些链接,我可以在其中深入了解有符号的无符号限制和格式说明符(%l 不适用于 sprintf,因此使用了 %u)。
约束 -
如果发生上溢/下溢0将被返回。
返回类型固定为int
- 编号。参数是固定的。
【问题讨论】:
-
如果我看到这样的
pow(2,31)我知道我不应该雇用这个人。 -
一个简单的请求就需要这么多代码。视为无符号,for 循环所有 sizeof(int) 位,用 & 和 | 抓取低位进入新的变种。以相反的方向移动输入和新变量直到完成。还有一些幻数异或可以用来更快地反转,或者使用内在的 rev 指令(如果存在)。
-
您可以使用 INT32_MAX 和 INT32_MIN。您可以避免使用 3 个字符串缓冲区而只使用 1 个,您可以通过迭代到字符串的一半来反转字符串,将前面的字符替换为后面的字符。更重要的是,您可以添加文档和 cmets 来解释极端情况是什么。
-
@MichaelDorgan:问题不在于反转位。就是产生小数位取反表示的数字。
-
@EricPostpischil,将无符号值分配给有符号值充满了 perl。
标签: c