一.题目描述
NC532神奇的数字
将字符串数字中为偶数位的数字进行翻转,将翻转后的结果进行输出。
二.算法(双指针)
根据题目的意思将字符串中为偶数位的数字进行翻转,既然是翻转那么就可以利用双指针。对于左边采用左指针l遍历,对于右指针采用r遍历,当两边的指针都找到偶数位的时候对两个指针所指位置进行交换,返回最后的字符串既为所求字符串。下面是完整代码:
class Solution { public: string change(string number) { //分别表示左右指针 int l=0,r=number.size()-1; while(l<r){ while(l<r&&(number[l]-'0')%2==1){ l++; } while(l<r&&(number[r]-'0')%2==1){ r--; } //左右指针进行交换 if(l<r) swap(number[l],number[r]); l++; r--; } return number; } };
时间复杂度: 只需要对字符串进行一次遍历
空间复杂度: 不需要额外空间
优缺点: 实现简单而且便于理解
三.算法(模拟)
我们直接遍历字符串,用一个新的字符数组记录偶数位的数字,再次遍历字符串,然后对偶数位的数字进行替换,按照上述思路我们即可得到题目所要的答案。下面是完整代码:
class Solution { public: string change(string number) { string s=""; vector<char>ans; if(number.size()<=1) return number;//对于单个字符串进行特判 for(int i = 0; i < number.size(); i++){ if((number[i]-'0')%2==0) { ans.push_back(number[i]);//偶数位进行记录 } } int n=ans.size()-1; //利用额外开辟的数字进行处理 for(int i=0;i<number.size();i++){ if((number[i]-'0')%2==0){ s+=ans[n];// 若为偶数将后面的替换上来,所以是从后往前遍历 n--; } else { s+=number[i];//不需要处理,加上原字符 } } return s; // 返回结果 } };
时间复杂度:只需要对数组进行两次遍历
空间复杂度:需要额外开辟数组对偶数位的字符串进行存储
优缺点:思路简单,但是实现复杂