分享字符串右移的算法
生活随笔
收集整理的這篇文章主要介紹了
分享字符串右移的算法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
描述:
定義字符串的左旋轉(zhuǎn)操作:把字符串前面的若干個(gè)字符移動(dòng)到字符串的尾部。
如把字符串a(chǎn)bcdef左旋轉(zhuǎn)2位得到字符串cdefab。
請實(shí)現(xiàn)字符串左旋轉(zhuǎn)的函數(shù),要求對長度為n的字符串操作的時(shí)間復(fù)雜度為O(n),空間復(fù)雜度為O(1)
對應(yīng)的詳細(xì)分析見:http://blog.csdn.net/v_july_v/article/details/6322882
實(shí)現(xiàn):
下面給出兩個(gè)可靠的java實(shí)現(xiàn):
package com.jiangdx.algrithmn;import java.util.Arrays;public class RotateShift {/*** 假設(shè)原數(shù)組序列為abcd1234,要求變換成的數(shù)組序列為1234abcd,即循環(huán)右移了4位。* 比較之后,不難看出,其中有兩段的順序是不變的:1234和abcd,可把這兩段看成兩個(gè)整體* 逆序排列abcd:abcd1234 → dcba1234;* 逆序排列1234:dcba1234 → dcba4321;* 全部逆序: dcba4321 → 1234abcd* * @param s* @param bit*/static void reverseRightShift(String[] s, int bit) {/** bit > length */int length = s.length;bit %= length;reverse(s, 0, length - bit - 1);reverse(s, length - bit, length - 1);reverse(s, 0, length - 1);}static void reverse(String[] s, int start, int end) {for (; start < end; start++, end--) {String t = s[start];s[start] = s[end];s[end] = t;}}/*** 所有序號為 (j+i *m) % n (j為0到gcd(n, m)-1之間的某一整數(shù),i = 0:n-1,m表示左旋轉(zhuǎn)位數(shù),n表示字符串長度),* 會構(gòu)成一個(gè)循環(huán)鏈(共有g(shù)cd(n,m)個(gè),gcd為n、m的最大公約數(shù)),* * 每個(gè)循環(huán)鏈上的元素只要移動(dòng)一個(gè)位置即可,最后整個(gè)過程總共交換了n次* (每一次循環(huán)鏈,是交換n/gcd(n,m)次,共有g(shù)cd(n,m)個(gè)循環(huán)鏈,所以,總共交換n次)。* example: [a, b, c, d, e, 1, 2, 3,4] 右移3位* gcd=3, 循環(huán)鏈=[a, d, 2] [b, e, 3] [c, 1, 4]* 循環(huán)鏈循環(huán)右移1個(gè)位置: [2, a, d] [3, b, e] [4, c, 1]* 結(jié)果: [2, 3, 4, a, b, c, d, e, 1]* * @param s* @param m*/static void rotateShift(String[] s, int m) {int length = s.length;int gcd = gcd(m, length);int count = length / gcd;for (int j = gcd - 1; j >= 0; j--) {String last = s[(j + (count - 2 + 1) * m) % length];int first = 0;for (int i = count - 2; i >= 0; i--) {first = (j + i * m) % length;s[(j + (i + 1) * m) % length] = s[(j + i * m) % length];}s[first] = last;}}/*** 求最大公約數(shù): 1、[求余數(shù)],令r=m%n,r為n除m所得余數(shù)(0<=r<n);* 2、[余數(shù)為0?],若r=0,算法結(jié)束,此刻,n即為所求答案,否則,繼續(xù),轉(zhuǎn)到3; 3、[重置],置m == n,n == r,返回步驟1.* * @param m* (m > 0)* @param n* (n > 0)*/static int gcd(int m, int n) {if (m < n) {int t = n;n = m;m = t;}int r = m % n;if (r == 0)return n;/** recursively find it */m = n;n = r;return gcd(m, n);}public static void main(String[] args) {String[] s = { "a", "b", "c", "d", "1", "2", "3", "4", "32" };System.err.println(Arrays.toString(s));// reverseRightShift(s, 5);rotateShift(s, 5);System.out.println(Arrays.toString(s));}}
轉(zhuǎn)載于:https://my.oschina.net/twinkling/blog/170303
總結(jié)
以上是生活随笔為你收集整理的分享字符串右移的算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CCNA学习指南第二章
- 下一篇: .h file not found