guodongxiaren / OJ

4 stars 3 forks source link

字符串向右循环移动K位 #25

Open guodongxiaren opened 4 years ago

guodongxiaren commented 4 years ago

编程之美2.17

将字符串向右循环移动 k 位。比如abcd1234向右移动4位是1234abcd。解法有很多,不暴力的情况下,时间和空间最优的解法是:

将 abcd1234,按k位分隔成两段,得到abcd和1234,这两段单独翻转,得到 dcba4321,然后对整个字符串进行翻转,得到 1234abcd。代码:

void reverse(char* arr, int b, int e) {
    for (; b < e; b++, e--) {
        char temp = arr[e];
        arr[e] = arr[b];
        arr[b] = temp;
    }
}

void right_shift(char* arr, int N, int k) {
    k %= N;
    reverse(arr, 0, N-K-1);
    reverse(arr, N-k, N-1);
    reverse(arr, 0, N-1);
}