[Leetcode学习]Perform String Shifts(字符串移位)

问题:

难度easy

说明:

输入会给一个string以及一个shift数组,shift是一个int[][]二维数组,当int[0] = 0时候往左移动,int[0] = 1往右移动。int[1]则是给出移动多少的位置,而且数组是想象成头尾相连的。

输入输出案例:

Input: s = "abcdefg", shift = [[1,1],[1,1],[0,2],[1,3]]
Output: "efgabcd"
Explanation:  
// 数组往右移动一位,数组最右的字符移到数组头部,就像是数组头尾相连一样,其他移动也是相通概念
[1,1] means shift to right by 1. "abcdefg" -> "gabcdef"
[1,1] means shift to right by 1. "gabcdef" -> "fgabcde"
[0,2] means shift to left by 2. "fgabcde" -> "abcdefg"
[1,3] means shift to right by 3. "abcdefg" -> "efgabcd"

我的代码:

思路是用一个指向string头部指针,然后移动这个指针就行,最后复制和创建一个新的string返回即可,100%RT&M。

不过考虑到数组是头尾相连的概念,头指针移动算法应该是求模。

左移动:head = (head + len - shift[1]) % len;

右移动:head = (head + shift[1]) % len;

class Solution {
    public String stringShift(String s, int[][] shift) {
        int len = s.length();
        char[] newchs = new char[s.length()];
        
        int head = 0;

        // 只进行head指针移位
        for(int i = 0;i < shift.length;i ++) {
            int[] temp = shift[i];
            if(temp[0] == 0) {
                head = (head + len - temp[1]) % len;
            } else {
                head = (head + temp[1]) % len;
            }
        }

        // 标记一下s的位置和计算末尾指针位置
        int j = 0;
        int end = (head + len - 1) % len;
        
        // 重新复制一个数组
        for(int i = head;i != end;i = (i + 1) % len) {
            newchs[i] = s.charAt(j ++);
        }
        newchs[end] = s.charAt(len - 1);

        // 返回一个新数组
        return new String(newchs);
    }
}

 

你可能感兴趣的:(Java)