本题来自LCR 182. 动态口令 - 力扣(LeetCode)
某公司门禁密码使用动态口令技术。初始密码为字符串 password
,密码更新均遵循以下步骤:
- 设定一个正整数目标值
target
- 将
password
前target
个字符按原顺序移动至字符串末尾
请返回更新后的密码字符串。
示例 1:
输入: password = "s3cur1tyC0d3", target = 4 输出: "r1tyC0d3s3cu"
示例 2:
输入: password = "lrloseumgh", target = 6 输出: "umghlrlose"
提示:
1 <= target < password.length <= 10000
这道题应该还有另一个比较耳熟能详的名字,字符串左旋
假如我们有“abcdef”这个字符串,移2个吧,也就是把“ab”挪到后面去
方法一:
依次将头元素放到后面,写一个循环,储存头元素,然后后面的元素依次前移,最后再把头元素放到末尾,这里是第一次储存a,把剩下的前挪就是“bcdef”,最后把a补上去,再循环一次就是b储存
char* dynamicPassword(char* password, int target) {
int len=strlen(password);
while(target)
{
char ch=*password;
for(int i=0;i<len;i++)
{
*(password+i)=*(password+i+1);
}
*(password+len-1)=ch;
target--;
}
return password;
}
方法二:
三部翻转法,先将前两个“ab”翻转一下就是“ba”
再将剩下的部分翻转一下就是“cdef”》》》》“fedc”
最后整体翻转“bafedc”变成“cdefab”
到此,结束!
神奇不?
void ustringsort(char* left, char* right)// 字符串翻转函数
{
while (left < right)
{
char ch = *left;
*left = *right;
*right = ch;
left++;
right--;
}
}
char* dynamicPassword(char* password, int target) {
int len = strlen(password);
ustringsort((password ), (password + target-1));
ustringsort((password + target), (password + len-1));
ustringsort((password ), (password + len-1));
return password;
}
自己写一个翻转函数就够了