地址:力扣
题目
给定一个包含小写英文字母的字符串 s
以及一个矩阵 shift
,其中 shift[i] = [direction, amount]
:
direction
可以为0
(表示左移)或1
(表示右移)。amount
表示s
左右移的位数。- 左移 1 位表示移除
s
的第一个字符,并将该字符插入到s
的结尾。 - 类似地,右移 1 位表示移除
s
的最后一个字符,并将该字符插入到s
的开头。
对这个字符串进行所有操作后,返回最终结果。
示例
输入:s = "abc", shift = [[0,1],[1,2]] 输出:"cab" 解释: [0,1] 表示左移 1 位。 "abc" -> "bca" [1,2] 表示右移 2 位。 "bca" -> "cab"
思路
1.先遍历所有vector中的移动步数,设置左移为+,右移为-,统计最终结果并确定dis正负号
2.通过dis来计算最后需要拼接的字符串的截断位置,根据dis正负号(代表左右移)来计算。
3.在上一步中需要注意的是:由于每次移动的步数可能大于字符串s的长度,所以要对s的长度n取模,右移(为-)则还需要加上n
代码
class Solution {
public:
string stringShift(string s, vector<vector<int>>& shift) {
int dis = 0,n = s.size();
for(auto &ope:shift){ //这一个循环是为了统计出总的左移/右移步数 +/-
if(ope[0] == 0) {
dis += ope[1];
}//左移
else
dis -= ope[1];
}
//将最后的左/右移转化为字符串中的下标
dis = (dis < 0 ? dis % n + n : dis % n);
string res = s.substr(dis) + s.substr(0,dis);
return res;
}
};