编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例 2:
输入:[“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]
思路: 这个思路比较简单,刚开拿到这个题,直接algorithm中的reverse,就A掉了, 但是调用别人的,自己的能力没法提高,所以就写了一个reverse, 双指针,一个指向头,从前往后,一个指向尾部,从后往前,每一次交换所指元素,直至相遇。
class Solution {
public:
void reverse1(vector<char> &s)
{
int len = s.size();
for (int i=0, j=len-1; i<=j; i++, j--)
{
swap(s[i], s[j]);
}
}
void reverseString(vector<char>& s) {
reverse1(s);
// 这个如果调用algorithm库的话 reverse(s.begin(), s.end()) 一句话A掉
}
};
这里的reverse函数应该记好了这种格式,写起来比较方便,并且很实用。
题目描述二- 整数翻转
题目描述:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路:
这个题比较好使的方式,就是数学的方式,我们知道一个整数,除10取余,就把个位的数就分开了,然后本身/10,再除10取余,就十位数就出来了,以此类推。 这里提供两个版本:
第一个是我的初步思路,还把正负分开讨论了,其实可以合起来。 这个题比较麻烦的地方是溢出的问题,就是把每个数分开之后再合起来的时候, 每一次遍历会*10, 这时候可能会溢出,需要判断。
核心代码如下:
while (x)
{
res = res * 10 + x % 10;
x /= 10;
}
上面的代码就是核心的代码,就是一个整数反转, 也是应该记住。
放到这个题中, 需要在*10的地方加入一个判断是否溢出。
两版代码如下:
class Solution
{
public:
int reverse(int x)
{
long long int res = 0;
// 判断一下x的符号,如果小于0, 变成绝对值操作,最后要加上-号
if (x<0)
{
x = -x;
//把每一位数拆开放入数组中
while (x>0)
{
int yushu = x % 10;
res = res * 10;
if (res > pow(2, 31)-1 || res < -pow(2, 31)-1)
return 0;
res = res + yushu;
x /= 10;
}
res = -res;
}
else
{
//把每一位数拆开放入数组中
while (x>0)
{
int yushu = x % 10;
res = res * 10;
if (res > pow(2, 31)-1 || res < -pow(2, 31)-1)
return 0;
res = res + yushu;
x /= 10;
}
}
return res;
}
};
简化的版本如下:
class Solution
{
public:
int reverse(int x)
{
if(x/10 == 0) return x; //平凡情况:若x∈[-9,9],则直接返回其本身
long res = 0;
while (x)
{
res = res * 10;
if (res > INT_MAX || res < INT_MIN)
return 0;
res = res + x % 10;
x /= 10;
}
return res;
}
};