【字符串左旋】

news/2024/11/29 7:40:17/

题目描述:
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB


问题解决:

假设字符串为"abcdef",要注意其实为"abcdef\0",我们可以将这个问题转换为n次的移动。首先,将第一个字符保存起来(a),然后求一下字符串的长度(6),然后从第二个字符开始到最后一个字符,依次去覆盖前一个字符。也就是说,通过循环(字符串长度减一次),将i位置的字符放在i+1的位置上。最后,将一开始保存的第一个字符直接放在最后一个字符的位置处,完成一次左移操作。通过最外层的循环来循环k次实现k次左移的循环操作。

#include <stdio.h>
#include <assert.h>void left_move(char* str, int k)
{int j = 0;assert(str);//不可以为空字符串for (j = 0; j < k; j++){//abcdef\0char tmp = *str;//先将a储存起来int len = strlen(str);//求一下字符串的长度int i = 0;for (i = 0; i < len - 1; i++){//长度为6,移到5次//从b开始到f依次移到前一个位置*(str + i) = *(str + i + 1);}//最后一个位置把刚刚保存的a放进去*(str + len - 1) = tmp;//循环k次表示移动k次}
}int main()
{char arr[] = "abcdef";int k = 0;scanf_s("%d", &k);left_move(arr, k);printf("%s\n", arr);return 0;
} 

设计循环使其可以旋1次,然后让他执行n次是一个最简单的思路:

void leftRound(char * src, int time)
{int i, j, tmp;int len = strlen(src);time %= len; //长度为5的情况下,旋转6、11、16...次相当于1次,7、12、17...次相当于2次,以此类推。for (i = 0; i < time; i++) //执行k次的单次平移{tmp = src[0];for(j = 0; j < len - 1; j++) //单次平移{src[j] = src[j + 1];}src[j] = tmp;}
}

还可以使用另一种方法:三次reverse

#include <stdio.h>
#include <assert.h>
void reverse(char* left, char* right)
{assert(left && right);while (left<right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}
}void left_move(char* str, int k)
{int len = strlen(str);k %= len;//避免重复操作//左边逆序reverse(str, str+k-1);//右边逆序reverse(str+k, str + len - 1);//整体逆序reverse(str, str + len-1);
}int main()
{char arr[] = "abcdef";//bafedc//cdefabint k = 0;scanf_s("%d", &k);//10%6=4left_move(arr, k);printf("%s\n", arr);return 0;
}
void reverse_part(char *str, int start, int end) //将字符串从start到end这一段逆序
{int i, j;char tmp;for (i = start, j = end; i < j; i++, j--){tmp = str[i];str[i] = str[j];str[j] = tmp;}
}void leftRound(char * src, int time)
{int len = strlen(src);int pos = time % len;reverse_part(src, 0, pos - 1); //逆序前段reverse_part(src, pos, len - 1); //逆序后段reverse_part(src, 0, len - 1); //整体逆序
}

当然,还有一种解法:

#include <stdio.h>
//#include <string.h>
#include<ctype.h>
void leftRound(char* src, int time)
{int len = strlen(src);int pos = time % len; //断开位置的下标char tmp[256] = { 0 }; //更准确的话可以选择malloc len + 1个字节的空间来做这个tmpstrcpy(tmp, src + pos); //先将后面的全部拷过来strncat(tmp, src, pos); //然后将前面几个接上strcpy(src, tmp); //最后拷回去
}
int main()
{char arr[] = "abcdef";int k = 0;scanf_s("%d", &k);leftRound(arr, k);printf("%s\n", arr);return 0;
}

http://www.ppmy.cn/news/841653.html

相关文章

LintCode 423. 有效的括号序列 JavaScript算法

描述 给定一个字符串所表示的括号序列&#xff0c;包含以下字符&#xff1a; ‘(’, ‘)’, ‘{’, ‘}’, ‘[’ and ‘]’&#xff0c; 判定是否是有效的括号序列。 括号必须依照 “()” 顺序表示&#xff0c; “()[]{}” 是有效的括号&#xff0c;但 “([)]” 则是无效的括…

leetcode每日一题-423:从英文中重建数字

leetcode每日一题-423:从英文中重建数字 链接 从英文中重建数字 题目 分析 首先我们先分析每个字母的组成&#xff0c;然后发现一些字符只在一个单词中出现&#xff0c;我们先去统计一下这些单词个数。 z,w,u,x,g都只出现在一个数字中&#xff0c;也就是0,2,4,6,8&#xff0…

《Bug 系列》Server returned HTTP response code: 423 for URL

前言 这个异常在网上的资料非常少&#xff0c;说明一般情况下&#xff0c;不会出现这个异常&#xff0c;都由操作系统、网络协议栈封装好了&#xff0c;开发者对此无感知。 现在出现了这个异常&#xff0c;一个非常可能的原因&#xff1a;开发者自己在其中做了某些处理。 异…

423D

题意&#xff1a;给出n个点&#xff0c;其中k个点只能有一条边相连&#xff0c;剩下的边至少有2条边相连&#xff0c;问构造出的树最远的两个点最近是多少 解答&#xff1a;度为1的点的数目越多&#xff0c;这个距离就越小。那么构造一个中心点&#xff0c;发散地连k个点。不够…

LeetCode 423. 从英文中重建数字

题目链接&#xff1a; 力扣https://leetcode-cn.com/problems/reconstruct-original-digits-from-english/ class Solution:def originalDigits(self, s: str) -> str:from collections import Counterc Counter(s)cnt [0] * 10cnt[0] c["z"]cnt[2] c["…

leetcode 423. Reconstruct Original Digits from English | 423. 从英文中重建数字(Java)

题目 https://leetcode.com/problems/reconstruct-original-digits-from-english/ 题解 class Solution {public String originalDigits(String s) {int[] total new int[26];for (int i 0; i < s.length(); i) {total[s.charAt(i) - a];}int[] num new int[10];// 0:…

423C

题意&#xff1a;告诉你一些字符串的信息&#xff0c;要求你重组并输出字典序最小的这个字符串&#xff0c;告诉你的信息是&#xff0c;某个子串在某几个位置出现&#xff0c;保证给的信息不冲突 解答&#xff1a;暴力&#xff01;但是&#xff01;要注意重复地位置要跳过&a…

TortoiseSVN提交提示423 Locked的解决办法

首先选择要提交的文件右键菜单&#xff1a;“TortoiseSVN->get locks”在对话框的左下角有个steal the locks选项&#xff0c;勾选这个选项&#xff0c;你就可以窃取别人的锁。然后你就成为锁的拥有者&#xff0c;然后commit提交即可。commit之后&#xff0c;点击TortoiseSV…