记几道比较常见的关于字符串的问题
第一:旋转字符串问题,如“abcXYZuvw”变为“XYZuvwabc”,即左旋转,此类问题是简单的字符串截取与拼接(subString);
1 public String LeftRotateString(String str,int n) { 2 if(str == null || n > str.length())return str; 3 return str.substring(n)+str.substring(0,n); 4 }
第二:字符串截取与翻转问题,如翻转英文句子“IU is my girlfriend”变为“girlfriend my is IU”,需要先将整个句子进行翻转,再对句子进行截取出单词,最后进行单词的翻转输出结果。
1 public String ReverseSentence(String str) { 2 if(str == null || str.length() == 0)return str; 3 char[] arr = str.toCharArray(); 4 reverse(arr, 0, arr.length - 1); 5 int first = 0; 6 int last = 0; 7 while(first < arr.length){ 8 if(arr[first] == ' '){ 9 first++; 10 last++; 11 }else if(last == arr.length || arr[last] == ' '){ 12 reverse(arr,first,last - 1); 13 first = ++last; 14 }else{ 15 last++; 16 } 17 } 18 return String.valueOf(arr); 19 } 20 21 22 private void reverse(char[] arr, int begin, int end){ 23 while(begin < end){ 24 char temp = arr[begin]; 25 arr[begin] = arr[end]; 26 arr[end] = temp; 27 begin++; 28 end--; 29 } 30 }
第三:扑克牌问题,在一副牌中选出五张,判断是否为顺子,其中大小王视为0并且可以替代任何数字。无论抽出的牌是否有大小王,需要满足的条件是牌不重复,并且抽出的牌最大最小数字插值小于5。
1 import java.util.TreeSet; 2 public class Solution { 3 public boolean isContinuous(int [] numbers) { 4 if(numbers.length < 5 || numbers.length > 5) 5 { 6 return false; 7 } 8 //记录大小王的数量 9 int king = 0; 10 TreeSet<Integer> ts = new TreeSet<>(); 11 for(int i = 0;i < numbers.length;i++){ 12 if(numbers[i] == 0){ 13 king++; 14 } 15 else{ 16 ts.add(numbers[i]); 17 } 18 } 19 if((king + ts.size()) != 5)return false; 20 if((ts.last() - ts.first()) < 5){ 21 return true; 22 } 23 return false; 24 } 25 }