学习目标:
- 344.反转字符串
- 541. 反转字符串II
- 卡码网:54.替换数字
- 151.翻转字符串里的单词
- 卡码网:55.右旋转字符串
学习内容:
344.反转字符串
题目链接 &&文章讲解
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
class Solution {
public void reverseString(char[] s) {
for(int i = 0 , j = s.length - 1 ; i < j; i++, j--){
//位运算
//s[i] ^= s[j];
//s[j] ^= s[i];
//s[i] ^= s[j];
//temp
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}
}
541.反转字符串Ⅱ
题目链接&&文章讲解
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样
class Solution {
//解法一:
public String reverseStr(String s, int k) {
char[] str = s.toCharArray();
for(int i = 0; i < s.length(); i = i+2*k){
//这里是判断尾数够不够k个来取决end指针的位置
int start = i;
int end = (i + k -1) > (str.length - 1) ? (str.length - 1) : (i + k -1);
reverse(str,start,end);
}
return new String(str);
}
//解法二
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
// 1. 每隔 2k 个字符的前 k 个字符进行反转
for (int i = 0; i< ch.length; i += 2 * k) {
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if (i + k <= ch.length) {
reverse(ch, i, i + k -1);
continue;
}
// 3. 剩余字符少于 k 个,则将剩余字符全部反转
reverse(ch, i, ch.length - 1);
}
return new String(ch);
}
public void reverse(char[] s, int left, int right){
for(int i = left, j = right; i < j; i++,j--){
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];
}
}
}
54.替换数字
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。
例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
对于输入字符串 “a5b”,函数应该将其转换为 “anumberb”
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
cin >> s;
int num;
int front = s.size()-1;
for(int i = 0;i < s.size();i++)
{
if(s[i] >= '0' && s[i] <= '9')
num++;
}
//先扩充空间
s.resize(num*5+front+1);
//从后往前填充
int back = s.size()-1;
for(;front < back;front--,back--)
{
if(s[front] >= '0' && s[front] <= '9')
{
s[back-5] = 'n';
s[back-4] = 'u';
s[back-3] = 'm';
s[back-2] = 'b';
s[back-1] = 'e';
s[back] = 'r';
back -= 5;
}
else
s[back] = s[front];
}
cout << s;
}
151.翻转字符串里的单词
题目链接&&文章讲解
移除多余空格 : “the sky is blue”
字符串反转:“eulb si yks eht”
单词反转:“blue is sky the”
class Solution {
public String reverseWords(String s) {
char[] chars = s.toCharArray();
//1.去除首尾以及中间多余空格
chars = removeEmp(chars);
//2.整个字符串反转
reverse(chars, 0, chars.length - 1);
//3.单词反转
reverseword(chars);
return new String(chars);
}
public char[] removeEmp(char[] s){
int slow = 0;
int fast = 0;
//在单词开始之前手动加空格
for(;fast < s.length;fast++){
if(s[fast] != ' '){
if(slow != 0){
s[slow++] = ' ';
}
while(fast < s.length && s[fast] != ' '){
s[slow++] = s[fast++];
}
}
}
char[] newStr = new char[slow];
System.arraycopy(s, 0, newStr, 0, slow);
return newStr;
}
public void reverse(char[] s, int left, int right){
for(int i = left, j = right; i < j; i++,j--){
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];
}
}
public void reverseword(char[] s){
int start = 0;
for(int end = 0; end <= s.length; end++){
if(end == s.length || s[end] == ' '){
reverse(s,start,end-1);
start = end + 1;
}
}
}
}