【题解】翻手算法
翻手算法(fanshou.cpp)
【问题描述】
⼩酷爱算法,他在编程珠玑⼀书中了解到了⼀种新的算法——翻⼿算法,为了更好的理解算 法,⼩明找来⼀叠纸牌,每⼀张纸牌上只有⼀个⼤写或⼩写的英⽂字母,他先把这叠纸牌进⾏洗牌操 作,假设洗牌后纸牌从第⼀张到最后⼀张的顺序是azxbcdy,然后按算法中介绍的那样,选择了⼀个翻⼿点 2。接着进⾏翻⼿操作: 第⼀次翻⼿,将前2张纸牌进⾏逆序排列,得到zaxbcdy; 第⼆次翻⼿,将剩下的5张纸牌进⾏逆序排列,得到zaydcbx; 第三次翻⼿,将现在的牌堆顺序进⾏逆序排列,得到xbcdyaz; 假设我们输入一行小写字母表示这叠纸牌的初始顺序,输入整数k作为翻手点,请你编写程序输出经 过三次翻手后的字符串。
【输入格式】
第一行:一行字符串,仅由大小写英文字母构成。 第二行:⼀个正整数k,表示翻手点。
【输出格式】
一行字符串,经过翻手算法后的字符串。
【样例输入】
azxbcdy 2
【样例输出】
xbcdyaz
【数据规模和约定】
30% 0<字符串⻓度<100
0<字符串长度<=1e5,0<k<=字符串长度
【题目分析】
比较简单的字符串模拟题。
可以以“翻手点”为基准,左右两侧使用不同的放法进行操作,左侧逆序,右侧逆序。(题目出的不好,第一次和第二次完全没有影响,所以可以由一个for循环实现)。
最后再进行一次逆序操作就行。
【参考代码】
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[1000],b[1000];
int fs;
int len,l,r;
cin>>a; //字符串
cin>>fs; //翻手点
len=strlen(a);
l=fs-1; //翻手点坐标
r=len-1; //末尾点坐标
for(int i=0;i<len;i++){
if(i<fs){ //如果是翻手点前的
b[i]=a[l--];
}
else{ //翻手点后的
b[i]=a[r--];
}
}
for(int i=0;i<len;i++){ //整体逆序
a[i]=b[len-i-1];
}
cout<<a;
return 0;
}扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。
