java實(shí)現(xiàn)左旋轉(zhuǎn)字符串
匯編語(yǔ)言中有一種移位指令叫做循環(huán)左移(ROL),現(xiàn)在有個(gè)簡(jiǎn)單的任務(wù),就是用字符串模擬這個(gè)指令的運(yùn)算結(jié)果。對(duì)于一個(gè)給定的字符序列S,請(qǐng)你把其循環(huán)左移K位后的序列輸出。例如,字符序列S=”abcXYZdef”,要求輸出循環(huán)左移3位后的結(jié)果,即“XYZdefabc”。是不是很簡(jiǎn)單?OK,搞定它!
代碼
解法一
最直觀的方式,依次將需要移位的字符移動(dòng)至最后,但是每個(gè)字符都需要移動(dòng)數(shù)組的長(zhǎng)度-1,如果數(shù)組的長(zhǎng)度是n,需要移k位,則總共需要移動(dòng) k * (n - 1)
public static String leftRotateString(String str, int n) {
if (Strings.isNullOrEmpty(str)) {
return str;
}
if (n < 0 || n >= str.length()) {
return str;
}
char[] strArray = str.toCharArray();
while (n-- > 0){
// 直接交換的方式,將需要移位的部分通過(guò)交換n-1次向左移動(dòng)
// 比如abcde,要移動(dòng)2位,即cdead
// 1. 將a移動(dòng)至最后,此時(shí)是bcdea
// 2. 將b移動(dòng)至最后,此時(shí)是cdeab
for (int i = 0; i < strArray.length - 1; i++) {
swap(strArray, i, i + 1);
}
}
return new String(strArray);
}
private static void swap(char[] str, int i, int j) {
char temp = str[i];
str[i] = str[j];
str[j] = temp;
}
解法二
借助字符串的反轉(zhuǎn),比如“ab”對(duì)應(yīng)“ba”,“xyz”對(duì)應(yīng)“zyx”,總共需要三步即可得到期望想過(guò)
- 反轉(zhuǎn)要移位的部分,”abcXYZdef”操作后是”cbaXYZdef”
- 反轉(zhuǎn)其余的部分,”cbaXYZdef”操作后是”cbafedZYX”
- 反轉(zhuǎn)整個(gè)字符串,”cbafedZYX”操作后是”XYZdefabc”
public static String leftRotateString2(String str, int n) {
if (Strings.isNullOrEmpty(str)) {
return str;
}
if (n < 0 || n >= str.length()) {
return str;
}
char[] strArray = str.toCharArray();
// 借助反轉(zhuǎn),分三步
// 1. 反轉(zhuǎn)要移位的部分
// 2. 反轉(zhuǎn)其余部分
// 3. 整體反轉(zhuǎn)
reverse(strArray, 0, n - 1);
reverse(strArray, n, strArray.length - 1);
reverse(strArray, 0, strArray.length - 1);
return new String(strArray);
}
/**
* 反轉(zhuǎn)字符串,兩端依次進(jìn)行交換即完成反轉(zhuǎn)
* @param str
* @param start
* @param end
*/
private static void reverse(char[] str, int start, int end) {
while (start < end) {
swap(str, start, end);
start++;
end--;
}
}
private static void swap(char[] str, int i, int j) {
char temp = str[i];
str[i] = str[j];
str[j] = temp;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Spring Cloud Hystrix斷路器實(shí)現(xiàn)容錯(cuò)和降級(jí)
本篇文章主要介紹了詳解Spring Cloud Hystrix斷路器實(shí)現(xiàn)容錯(cuò)和降級(jí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
如何利用rabbitMq的死信隊(duì)列實(shí)現(xiàn)延時(shí)消息
這篇文章主要介紹了如何利用rabbitMq的死信隊(duì)列實(shí)現(xiàn)延時(shí)消息問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
Mybatis源碼分析之存儲(chǔ)過(guò)程調(diào)用和運(yùn)行流程
這一篇我們學(xué)習(xí)一下Mybatis調(diào)用存儲(chǔ)過(guò)程的使用和運(yùn)行流程,首先我們創(chuàng)建一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程,具體創(chuàng)建過(guò)程大家可以通過(guò)本文學(xué)習(xí)下2016-11-11
java實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)單鏈表示例(java單鏈表)
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)單鏈表示例,需要的朋友可以參考下2014-03-03
Java GZip 基于內(nèi)存實(shí)現(xiàn)壓縮和解壓的方法
這篇文章主要介紹了Java GZip 基于內(nèi)存實(shí)現(xiàn)壓縮和解壓的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
SpringBoot從Nacos讀取MySQL數(shù)據(jù)庫(kù)配置錯(cuò)誤:Public Key Retrieva
最近的項(xiàng)目,突然都從MySQL5.7升級(jí)到8.0了,有些項(xiàng)目能運(yùn)行成功,有些項(xiàng)目遇到了問(wèn)題,啟動(dòng)不成功,顯示數(shù)據(jù)庫(kù)方面的異常信息,本文給大家介紹了SpringBoot從Nacos讀取MySQL數(shù)據(jù)庫(kù)配置錯(cuò)誤:Public Key Retrieval is not allowed的解決方案,需要的朋友可以參考下2024-04-04

