商城网站建设建站系统,网站用户体验分析怎么做,为公司制作网站,维度网络专业做网站字符串 - 541.反转字符串II(C#和C实现)
题目描述
给定一个字符串 s 和一个整数 k#xff0c;你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个#xff0…字符串 - 541.反转字符串II(C#和C实现)
题目描述
给定一个字符串 s 和一个整数 k你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个则反转前 k 个字符剩余字符保持原样。
示例:
输入: s abcdefg, k 2
输出: bacdfeg
解释: 从字符串开头算起第一组 2k 字符是 ab第二组 2k 字符是 cd所以最终答案是 bacdfeg。提示:
该字符串只包含小写英文字母。给定字符串的长度和 k 在 [1, 10000] 范围内。
解题思路
类比和解题步骤
考虑类比假设你有一条领带你希望每隔一段距离将其中的一部分领带反转。你可以通过遍历字符串按照规定的间隔2k对每一部分进行反转。
遍历字符串 从字符串的开头开始按照 2k 的间隔遍历字符串。反转部分字符 对每一部分的前 k 个字符进行反转。处理剩余字符 如果剩余字符少于 k 个则将其全部反转。
特殊案例
如果输入字符串为空则直接返回空字符串。
C#代码实现
public string ReverseStr(string s, int k) {// 如果字符串为空或者 k 小于等于 0则直接返回if (string.IsNullOrEmpty(s) || k 0) {return s;}// 将字符串转换为字符数组char[] charArray s.ToCharArray();int n charArray.Length;// 遍历字符数组每隔 k 个字符反转一次for (int i 0; i n; i 2 * k) {// 左指针int left i;// 右指针取最小值防止数组越界int right Math.Min(i k - 1, n - 1);// 交换左右指针指向的字符并移动指针while (left right) {// 反转前 k 个字符char temp charArray[left];charArray[left] charArray[right];charArray[right] temp;// 移动指针left;right--;}}// 将字符数组转换为字符串return new string(charArray);
}C代码实现
char* reverseStr(char* s, int k) {// 如果传入的字符串为空或者 k 小于等于 0则直接返回if (s NULL || k 0) {return s;}// 获取字符串长度int n strlen(s);// 遍历字符串每隔 k 个字符反转一次for (int i 0; i n; i 2 * k) {// 记录左指针int left i;// 记录右指针如果右指针超过字符串长度则取字符串最后一个字符int right fmin(i k - 1, n - 1);// 交换左右指针指向的字符并移动指针while (left right) {// 反转前 k 个字符// 交换左右指针指向的字符char temp s[left];s[left] s[right];s[right] temp;// 移动指针left;right--;}}return s;
}时间复杂度和空间复杂度
时间复杂度O(n)其中 n 是字符串 s 的长度。遍历字符串一次。空间复杂度O(1)。只使用了常数级别的额外空间。
参与点评
读者朋友们,如果您在阅读过程中,对文章的质量、易理解性有任何建议,欢迎在评论区指出,我会认真改进。