344.反转字符串
题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组
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 码表中的可打印字符
思路:
使用双指针的方法,直接让一个指针指向数组首元素,再让一个指针指向数组末尾元素,改变两个指针位置的值实现交换,依次更新两个指针的位置,直到实现数组元素的全部交换
代码:
void reverseString(char* s, int sSize) {
int n1 = 0, n2 = sSize-1;
while(n1<n2)
{
char tem = s[n1];
s[n1] = s[n2];
s[n2] = tem;
n1++;
n2--;
}
}
541.反转字符串II
题目描述:
给定一个字符串
s
和一个整数k
,从字符串开头算起,每计数至2k
个字符,就反转这2k
字符中的前k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。- 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg"示例 2:
输入:s = "abcd", k = 2 输出:"bacd"提示:
1 <= s.length <= 104
s
仅由小写英文组成1 <= k <= 104
思路:
每次都是处理一块数据,即2k段,交换前k个元素
交换过程依然使用双指针的方法来进行交换
代码:
char* reverseStr(char* s, int k) {
for(int i = 0 ; i < strlen(s) ; i+=2*k)
{
//判断数组末尾是否够k个元素
k = i+k > strlen(s)? strlen(s)-i : k;
int slow = i;
int fast = i+k-1;
while(slow < fast)
{
char tem = s[slow];
s[slow++] = s[fast];
s[fast--] = tem;
}
}
return s;
}
卡码网:24.替换数字
题目描述:
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
输入描述
输入一个字符串 s,s 仅包含小写字母和数字字符。
输出描述
打印一个新的字符串,其中每个数字字符都被替换为了number
输入示例
a1b2c3
输出示例
anumberbnumbercnumber
提示信息
数据范围:
1 <= s.length < 10000。
思路:
先进行数组空间的扩充,即将数字替换为number后需要的空间的大小,再由后往前的依次填充number,使用双指针来进行替换,一个指针指向新长度的末尾,一个指针指向旧长度的末尾,再整体向前填充
代码后序补充
151.反转字符串
题目描述:
给你一个字符串
s
,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。
s
中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串
s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。示例 1:
输入:s = "the sky is blue
" 输出:"blue is sky the
"示例 2:
输入:s = " hello world " 输出:"world hello" 解释:反转后的字符串中不能存在前导空格和尾随空格。示例 3:
输入:s = "a good example" 输出:"example good a" 解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。提示:
1 <= s.length <= 104
s
包含英文大小写字母、数字和空格' '
s
中 至少存在一个 单词
思路:
1.将多余的空格删除(双指针)
与数组移除元素想法一致,快指针指向我们想要获取的元素,慢指针指向我们要获取元素的新位置,注意单词之间要保留一个空格
2.进行整体的反转(双指针)
3.将单词再次进行翻转(双指针)
代码:
//翻转一个范围内的单词
void rever(char *s , int start , int end)
{
while(start < end)
{
char tem = s[start];
s[start++] = s[end];
s[end--] = tem;
}
}
//删除多余的空格
void del_nul(char *s)
{
int start = 0;
int end = strlen(s)-1;
//找到第一个不为空格的位置
while(s[start] == ' ')
start++;
//找到不为空格的最后一个位置
while(s[end] == ' ')
end--;
//指向每个单词的开头位置
int slow = 0;
for(int i = start ; i <= end ; i++)
{
if(s[i] == ' ' && s[i+1] == ' ')
continue;
s[slow++] = s[i];
}
s[slow] = '\0';
}
char* reverseWords(char* s) {
//清空多余空格
del_nul(s);
//进行翻转
rever(s,0,strlen(s)-1);
//查找每个单词的开头
int slow = 0;
for(int i = 0 ; i <= strlen(s); i++)
{
if(s[i] ==' ' || s[i] == '\0')
{
rever(s,slow,i-1);
slow = i + 1;
}
}
return s;
}