日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分享字符串右移的算法

發(fā)布時(shí)間:2024/4/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分享字符串右移的算法 小編覺得挺不錯(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。