java實現(xiàn)左旋轉(zhuǎn)字符串
匯編語言中有一種移位指令叫做循環(huán)左移(ROL),現(xiàn)在有個簡單的任務(wù),就是用字符串模擬這個指令的運算結(jié)果。對于一個給定的字符序列S,請你把其循環(huán)左移K位后的序列輸出。例如,字符序列S=”abcXYZdef”,要求輸出循環(huán)左移3位后的結(jié)果,即“XYZdefabc”。是不是很簡單?OK,搞定它!
代碼
解法一
最直觀的方式,依次將需要移位的字符移動至最后,但是每個字符都需要移動數(shù)組的長度-1,如果數(shù)組的長度是n,需要移k位,則總共需要移動 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){
// 直接交換的方式,將需要移位的部分通過交換n-1次向左移動
// 比如abcde,要移動2位,即cdead
// 1. 將a移動至最后,此時是bcdea
// 2. 將b移動至最后,此時是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”對應(yīng)“ba”,“xyz”對應(yīng)“zyx”,總共需要三步即可得到期望想過
- 反轉(zhuǎn)要移位的部分,”abcXYZdef”操作后是”cbaXYZdef”
- 反轉(zhuǎn)其余的部分,”cbaXYZdef”操作后是”cbafedZYX”
- 反轉(zhuǎn)整個字符串,”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)字符串,兩端依次進行交換即完成反轉(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;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
為Java應(yīng)用創(chuàng)建Docker鏡像的3種方式總結(jié)
Docker的使用可以將應(yīng)用程序做成鏡像,這樣可以將鏡像發(fā)布到私有或者公有倉庫中,在其他主機上也可以pull鏡像,并且運行容器,運行程,下面這篇文章主要給大家總結(jié)介紹了關(guān)于為Java應(yīng)用創(chuàng)建Docker鏡像的3種方式,需要的朋友可以參考下2023-06-06
一文講解Java的String、StringBuffer和StringBuilder的使用與區(qū)別
String是不可變的字符序列,而StringBuffer和StringBuilder是可變的字符序列,本文就來詳細的介紹一下Java的String、StringBuffer和StringBuilder的使用與區(qū)別,感興趣的可以了解一下2024-03-03
nacos中的配置使用@Value注解獲取不到值的原因及解決方案
這篇文章主要介紹了nacos中的配置使用@Value注解獲取不到值的原因分析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
SpringMVC @ResponseBody 415錯誤處理方式
這篇文章主要介紹了SpringMVC @ResponseBody 415錯誤處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
使用Java代碼獲取服務(wù)器性能信息及局域網(wǎng)內(nèi)主機名
這篇文章主要介紹了使用Java代碼獲取服務(wù)器性能信息及局域網(wǎng)內(nèi)主機名的方法,方便對服務(wù)器的遠程管理和團隊協(xié)作時用到,而且文中的方法無需調(diào)用jni,需要的朋友可以參考下2015-11-11

