java之左旋轉(zhuǎn)字符串介紹
題目:定義字符串的左旋轉(zhuǎn)操作:把字符串前面的若干個(gè)字符移動(dòng)到字符串的尾部。如把字符串a(chǎn)bcdef左旋轉(zhuǎn)2位得到字符串cdefab。請(qǐng)實(shí)現(xiàn)字符串左旋轉(zhuǎn)的函數(shù)。要求時(shí)間對(duì)長(zhǎng)度為n的字符串操作的復(fù)雜度為O(n),輔助內(nèi)存為O(1)。
分析:如果不考慮時(shí)間和空間復(fù)雜度的限制,最簡(jiǎn)單的方法莫過于把這道題看成是把字符串分成前后兩部分,通過旋轉(zhuǎn)操作把這兩個(gè)部分交換位置。于是我們可以新開辟一塊長(zhǎng)度為n+1的輔助空間,把原字符串后半部分拷貝到新空間的前半部分,在把原字符串的前半部分拷貝到新空間的后半部分。不難看出,這種思路的時(shí)間復(fù)雜度是O(n),需要的輔助空間也是O(n)。
接下來的一種思路可能要稍微麻煩一點(diǎn)。我們假設(shè)把字符串左旋轉(zhuǎn)m位。于是我們先把第0個(gè)字符保存起來,把第m個(gè)字符放到第0個(gè)的位置,在把第2m個(gè)字符放到第m個(gè)的位置…依次類推,一直移動(dòng)到最后一個(gè)可以移動(dòng)字符,最后在把原來的第0個(gè)字符放到剛才移動(dòng)的位置上。接著把第1個(gè)字符保存起來,把第m+1個(gè)元素移動(dòng)到第1個(gè)位置…重復(fù)前面處理第0個(gè)字符的步驟,直到處理完前面的m個(gè)字符。
該思路還是比較容易理解,但當(dāng)字符串的長(zhǎng)度n不是m的整數(shù)倍的時(shí)候,寫程序會(huì)有些麻煩,感興趣的朋友可以自己試一下。由于下面還要介紹更好的方法,這種思路的代碼我就不提供了。
我們還是把字符串看成有兩段組成的,記位XY。左旋轉(zhuǎn)相當(dāng)于要把字符串XY變成YX。我們先在字符串上定義一種翻轉(zhuǎn)的操作,就是翻轉(zhuǎn)字符串中字符的先后順序。把X翻轉(zhuǎn)后記為XT。顯然有(XT)T=X。
我們首先對(duì)X和Y兩段分別進(jìn)行翻轉(zhuǎn)操作,這樣就能得到XTYT。接著再對(duì)XTYT進(jìn)行翻轉(zhuǎn)操作,得到(XTYT)T=(YT)T(XT)T=YX。正好是我們期待的結(jié)果。
分析到這里我們?cè)倩氐皆瓉淼念}目。我們要做的僅僅是把字符串分成兩段,第一段為前面m個(gè)字符,其余的字符分到第二段。再定義一個(gè)翻轉(zhuǎn)字符串的函數(shù),按照前面的步驟翻轉(zhuǎn)三次就行了。時(shí)間復(fù)雜度和空間復(fù)雜度都合乎要求。
public class Test_21 {
public static void main(String[] args){
StringBuilder str = new StringBuilder("abcde");
int index =5;
System.out.println(LeftTurn(str,index));
}
public static String LeftTurn(StringBuilder sb,int index){
int strlen = sb.length();
if(sb !=null&&index>=0&&index<=strlen){
int firststart = 0;
int firstend = index-1;
int secondfirst = index;
int secondend = strlen-1;
ReverseString(sb,firststart,firstend);
ReverseString(sb,secondfirst, secondend);
ReverseString(sb,firststart,secondend);
return sb.toString();
}
return null;
}
public static void ReverseString(StringBuilder str,int begin, int end){
while(begin<=end){
char temp = str.charAt(begin);
str.setCharAt(begin, str.charAt(end));
str.setCharAt(end, temp);
begin++;
end--;
}
System.out.println(str);
}
}
相關(guān)文章
SpringBoot集成Nacos實(shí)現(xiàn)注冊(cè)中心與配置中心流程詳解
這篇文章主要介紹了SpringBoot集成Nacos實(shí)現(xiàn)注冊(cè)中心與配置中心流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02
Java 生成任意長(zhǎng)度的驗(yàn)證碼過程解析
這篇文章主要介紹了Java 生成任意長(zhǎng)度的驗(yàn)證碼過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Java設(shè)計(jì)模式之代理模式(Proxy模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之代理模式(Proxy模式)介紹,本文講解了為什么要使用代理模式、如何使用代理模式等內(nèi)容,需要的朋友可以參考下2015-03-03
微服務(wù)領(lǐng)域Spring Boot自動(dòng)伸縮的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于微服務(wù)領(lǐng)域Spring Boot自動(dòng)伸縮的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10
java如何從地址串中解析提取省市區(qū)(完美匹配中國(guó)所有地址)
這篇文章主要給大家介紹了關(guān)于java如何從地址串中解析提取省市區(qū)的相關(guān)資料,通過這個(gè)方法可以完美匹配中國(guó)所有地址,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
SpringBoot項(xiàng)目多數(shù)據(jù)源及mybatis 駝峰失效的問題解決方法
這篇文章主要介紹了SpringBoot項(xiàng)目多數(shù)據(jù)源及mybatis 駝峰失效的問題解決方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
SpringMVC互聯(lián)網(wǎng)軟件架構(gòu)REST使用詳解
這篇文章主要為大家詳細(xì)介紹了SpringMVC互聯(lián)網(wǎng)軟件架構(gòu)REST的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
java實(shí)現(xiàn)基于UDP協(xié)議的聊天小程序操作
UDP是與TCP相對(duì)應(yīng)的協(xié)議,UDP適用于一次只傳送少量數(shù)據(jù)、對(duì)可靠性要求不高的應(yīng)用環(huán)境。正因?yàn)閁DP協(xié)議沒有連接的過程,所以它的通信效率高;但也正因?yàn)槿绱耍目煽啃圆蝗鏣CP協(xié)議高,本文給大家介紹java實(shí)現(xiàn)基于UDP協(xié)議的聊天小程序操作,感興趣的朋友一起看看吧2021-10-10

