反转字符串
题目
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例 2:
输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]
提示:
1 <= s.length <= 105
s[i] 都是 ASCII 码表中的可打印字符
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnhbqj/
来源:力扣(LeetCode)
void reverseString(char* s, int sSize)
{
char t;
for (int i = 0; i < (sSize / 2); i++)
{
t = s[i];
s[i] = s[sSize - i - 1];
s[sSize - i - 1] = t;
}
}
这个是很简单的,整数反转是在这个基础上的
整数反转
题目
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-231 <= x <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
很繁琐的解法,用了itoa和atoi(数字转字符串和字符串转数字来解答)
char* Myitoa(char* str, int n);
int Myatoi(char* str)
{
char s1[] = "2147483647";
char s2[] = "-2147483648";
int i = 0, n = 0;
if (str == NULL)
return 0;
else if (str[0]=='-')
{
if ((strlen(str) == strlen(s2)) && (strcmp(str, s2) > 0))
return 0;
i++;
while (isdigit(str[i]))
{
n = 10 * n + (str[i] - '0');
i++;
}
return -n;
}
else
{
if (strlen(str) == strlen(s1) && strcmp(str, s1) > 0)
return 0;
while (isdigit(str[i]))
{
n = 10 * n + (str[i] - '0');
i++;
}
return n;
}
}
char* Myitoa(char* str, int n)//123->"321"->"123"
{
int i = 0;
if (n > 0)
{
while (n != 0)
{
str[i++] = n % 10 + '0';
n /= 10;
}
}
else if (n < 0)
{
if (n == -2147483648)
{
return NULL;
}
n = -n;
i++;
while (n != 0)
{
str[i++] = n % 10 + '0';
n /= 10;
}
str[0] = '-';
}
else
str[i] = 0;
str[i] = '\0';
return str;
}
int reverse(int x)
{
char str[100];
x = Myatoi(Myitoa(str, x));
return x;
}
官方的解法我大为震撼,看了之后我写的简直了
不过这个if语句的判断需要证明一下,比较繁琐
int reverse(int x)
{
int rev = 0;
while (x != 0)
{
if (rev < INT_MIN / 10 || rev > INT_MAX / 10)
{
return 0;
}
int digit = x % 10;
x /= 10;
rev = rev * 10 + digit;
}
return rev;
}