题目描述
将字符串数字中为偶数位的数字进行翻转,将翻转后的结果进行输出。
方法一:暴力求解
求解思路
对于本题目要求翻转偶数位的数字,我们直接遍历字符串,用一个辅助数组记录偶数位的数字,再次遍历字符串,对偶数位的数字进行替换,按照上述思路我们即可得到题目所要的答案。
解题代码
class Solution {
public:
string change(string number) {
string myres = ""; // 声明变量,记录结果
vector<char> temp; // 声明临时变量
int n = number.size();
if(n <= 1) // 如果只有1位或者空,直接返回原串
return number;
for(int i = 0; i < n; i++)
if((number[i] - '0') % 2 == 0) // 若为偶数位记录下来
temp.push_back(number[i]);
int m = temp.size() - 1;
for(int i = 0; i < n; i++)
{
if((number[i] - '0') % 2 == 0) // 若为偶数将后面的替换上来
myres += temp[m--];
else
myres += number[i];
}
return myres; // 返回结果
}
};复杂度分析
时间复杂度:一层循环,因此时间复杂度为
空间复杂度:使用辅助数组temp[n],因此空间复杂度为
方法二:双指针思想求解
求解思路
对于本题我们也可以使用双指针来对问题进行解决,我们使用头指针和尾指针,让它们从字符串的两边开始往中间进行迭代,遇到偶数位的数字进行交换,根据上述操作即可得到本题的答案。
解题代码
class Solution {
public:
string change(string number)
{
int n = number.length();
if(n <= 1)
return number;// 如果只有1位或者空,直接返回原串
int i = 0;
int j = n - 1;
while(i < j)
{ //直到两个指针相遇,遍历结束
while(i < j && (number[i] - '0') % 2 != 0) // 找到后续第一个偶数
i++;
while(j > i && (number[j] - '0') % 2 != 0) // 找到前续第一个偶数
j--;
if(i < j)
{ //翻转两指针所指向的数字
char temp = number[i];
number[i] = number[j];
number[j] = temp;
i++; // 指针移动
j--;
}
}
return number; // 返回结果
}
};复杂度分析
时间复杂度:一层循环,因此时间复杂度为
空间复杂度:没有使用额外的内存地址空间,因此空间复杂度为

京公网安备 11010502036488号