题目1:给定一个 32 位有符号整数,将整数中的数字进行反转。
分析:模10,除10可以获得整数的每一位;(正负都可以)
//代码一
int reverse(int x) {
long a=0;
long y=x;
while(y)
{
a=a*10+y%10;
y/=10;
}
if(a<INT_MIN||a>INT_MAX)
{
return 0;
}
return a;
}
//代码二
//利用一个数发生了变化,再按照相反步骤返回上一个值,如果发生了变化,说明越界
int reverse(int x) {
int y=0;
while(x)
{
int temp=y;
y=y*10+x%10;
if((y-x%10)/10!=temp)
{
return 0;
}
x/=10;
}
return y;
}
题目二:颠倒给定的 32 位无符号整数的二进制位。
示例:
输入: 43261596 输出: 964176192 解释: 43261596 的二进制表示形式为 00000010100101000001111010011100 , 返回 964176192,其二进制表示形式为 00111001011110000010100101000000 。
//构造
uint32_t reverseBits(uint32_t n) {
uint32_t ret = 0;
int i = 0;
for(;i<32;i++)
{
ret <<= 1;
ret = ret | ((n>>i)&1);
}
return ret;
}
题目三:有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student".
要求:
不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
分析:先每个单词翻转,在整体翻转
#include<stdio.h>
void reverse(char *left,char *right)
{
while(left<=right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void reverse_arr(char arr[])
{
char *pp = arr;
char *p = arr;
while(*p !='\0')
{
while(*p == ' ')
{
reverse(pp,p-1);
p++;
pp = p;
continue;
}
p++;
}
reverse(pp,p-1);
reverse(arr,p-1);
}