C 格式说明符和反转32位有符号整数
在一次访谈中,我得到了一个代码,用来编写一个函数来反转一个32位有符号整数,我在第三次尝试中编写了这个代码(与所有测试用例一起使用):C 格式说明符和反转32位有符号整数,c,C,在一次访谈中,我得到了一个代码,用来编写一个函数来反转一个32位有符号整数,我在第三次尝试中编写了这个代码(与所有测试用例一起使用): intfun(intx) { 字符a[11]=“”;//这将包含数字“x”的绝对值的字符形式 char b[11]=“”;//这将包含绝对数“x”的倒数 字符e[11]=“”; 短符号=-1; 短指数_a=0; 短指数_b=0; 短指数_e=0; 短期温度指数=0; if(x0) { sprintf(a,“%u”,(无符号整数)x); sprintf(e,“%u
intfun(intx)
{
字符a[11]=“”;//这将包含数字“x”的绝对值的字符形式
char b[11]=“”;//这将包含绝对数“x”的倒数
字符e[11]=“”;
短符号=-1;
短指数_a=0;
短指数_b=0;
短指数_e=0;
短期温度指数=0;
if(x0)
{
sprintf(a,“%u”,(无符号整数)x);
sprintf(e,“%u”,(无符号整数)(-1*(长整数)(pow(2,31)-1));//设置限制
符号=1;
}
其他的
x=0;
指数a=strlen(a);
--指数a;
//“b”将包含数组“a”的反向数字
while(index_a>=0)//按相反顺序逐个字符将其存储在“b”中
{
b[index_b++]=a[index_a--];
}
//这里索引_a等于-1,索引_b等于'strlen(b)'
if(index_b==10)//10是(2^31-1)或(2^31)中的位数
{
while(临时索引[索引])
返回0;
else if(b[temp_index]
我被要求提高,但我不能(后来才知道这个问题是为了过滤——我想我失败了)——你能建议其他方法吗
我面临的主要问题是当变量x等于-(2^31)时,这就是为什么我不能简单地编写x=abs(x)
-你能给我推荐一些链接,让我深入阅读有符号无符号限制和格式说明符吗(%l不能与sprintf
一起使用,因此使用了%u
)
约束-
- 如果发生溢流/下溢,则返回0
- 返回类型固定为int
- 参数的数量是固定的
int reverse10(int val)
{
long long result = 0 ;
while(val)
{
result *= 10;
result += val % 10;
val /= 10;
}
if(result < INT_MIN || result > INT_MAX) return 0;
return result;
}
int rev(int32_t val, int32_t *result)
{
int32_t temp;
int digit;
*result = 0;
while(val)
{
temp = *result;
*result *= 10;
if(temp != (*result / 10)) {*result = 0; return -1;}
temp = *result;
digit = val % 10;
*result += digit;
if(temp != (*result - digit)) {*result = 0; return -1;}
val /= 10;
}
return 0;
}
int rev1(int val)
{
int temp;
int digit;
int result = 0;
while(val)
{
temp = result;
result *= 10;
if(temp != (result / 10)) return 0;
temp = *result;
digit = val % 10;
result += digit;
if(temp != (result - digit)) return 0;
val /= 10;
}
return result;
}
int反转10(int val)
{
长结果=0;
while(val)
{
结果*=10;
结果+=val%10;
val/=10;
}
if(resultINT_MAX)返回0;
返回结果;
}
int rev(int32_t val,int32_t*结果)
{
内部温度;
整数位数;
*结果=0;
while(val)
{
温度=*结果;
*结果*=10;
如果(temp!=(*result/10)){*result=0;返回-1;}
温度=*结果;
数字=val%10;
*结果+=位数;
如果(temp!=(*result-digit)){*result=0;返回-1;}
val/=10;
}
返回0;
}
内部版本1(内部版本)
{
内部温度;
整数位数;
int结果=0;
while(val)
{
温度=结果;
结果*=10;
如果(温度!=(结果/10))返回0;
温度=*结果;
数字=val%10;
结果+=位数;
如果(温度!=(结果-数字))返回0;
val/=10;
}
返回结果;
}
如果我看到这样的东西pow(2,31)
我知道我不应该雇用这个家伙。一个简单的请求需要这么多代码。将其视为未签名,for loop all sizeof(int)位,用&和|获取低位到新变量。将输入和新变量向相反方向移位直到完成。还有两个幻数异或,可以用来更快地反转,或者使用内部rev指令(如果存在)。您可以使用INT32_MAX和INT32_MIN。您可以避免使用3个字符串缓冲区,只使用1个,也可以进行混响通过迭代到字符串的一半,将前面的字符替换为后面的字符,来转换字符串。更重要的是,您可以添加文档和注释来解释角大小写是什么。@MichaelDorgan:问题不在于位的反转。问题是产生由十进制数字的反转表示的数字。@EricPostDischil,assigning从无符号值到有符号值的转换充满了perl。从提供的代码中可以明显看出,这个问题有处理溢出的要求,而这个答案并不能满足这一点。@EricPostFischil实际上没有。我问了类似的问题,看看受访者是否理解这个问题。面试问题必须非常简单,但说明了这一点方法因为人们通常压力很大,必须考虑到accountreturn类型是固定的-intStill,mod div 10也是我的方法。@AgrudgeAmicus我看这里没有错-UV。如果代码必须返回一个int
,在函数末尾测试结果是否在[int\u MIN…int\u MAX]范围内并根据需要处理超出范围的答案。
int reverse10(int val)
{
long long result = 0 ;
while(val)
{
result *= 10;
result += val % 10;
val /= 10;
}
if(result < INT_MIN || result > INT_MAX) return 0;
return result;
}
int rev(int32_t val, int32_t *result)
{
int32_t temp;
int digit;
*result = 0;
while(val)
{
temp = *result;
*result *= 10;
if(temp != (*result / 10)) {*result = 0; return -1;}
temp = *result;
digit = val % 10;
*result += digit;
if(temp != (*result - digit)) {*result = 0; return -1;}
val /= 10;
}
return 0;
}
int rev1(int val)
{
int temp;
int digit;
int result = 0;
while(val)
{
temp = result;
result *= 10;
if(temp != (result / 10)) return 0;
temp = *result;
digit = val % 10;
result += digit;
if(temp != (result - digit)) return 0;
val /= 10;
}
return result;
}