自己的解法:
就是用一个StringBuffer来进行字符串的接收,利用一个指针来指示当前是哪一个k部分,当 i + k < s.length() 时,证明从 i 到 i + k - 1部分是可以进行反转的,而从i + k 部分到 i + 2 * k部分是直接进行拼接,利用条件 j < s.length()即可进行限制,不过对于最后剩余的一小部分如果是需要反转的,那么就不能使用上面反转时使用的条件 : 从j = i + k - 1 ,而是从 j = s.length() - 1开始到 i 结束
class Solution { public String reverseStr(String s, int k) { if(s == null || s.length() == 0 || k == 0) return s; StringBuffer str = new StringBuffer(); int i = 0; while(i + k < s.length()){ for(int j = i + k - 1; j >= i && j < s.length(); j--){ str.append(s.charAt(j)); } i += k; for(int j = i; j < i + k && j < s.length(); j++){ str.append(s.charAt(j)); } i += k; } if(i + k >= s.length()){ for(int j = s.length() - 1; j >= i; j--){ str.append(s.charAt(j)); } } return str.toString(); } }
public String reverseStr(String s, int k) { if(s == null || s.isEmpty()){return s;} StringBuilder sb = new StringBuilder(); boolean reverse = true; for(int i = 0; i < s.length(); i = i + k, reverse = !reverse){ int end = (i + k) < s.length() ? (i + k - 1) : s.length()-1; if(reverse) for(int j = end; j >= i; j--){sb.append(s.charAt(j));} // Copy in reverse else for(int j = i; j <= end; j++){sb.append(s.charAt(j));} // Copy as it is } return sb.toString(); }
public String reverseStr(String s, int k) { char[] ch = s.toCharArray(); for (int i = 0; i < ch.length; i += 2 * k) { rev(ch, i, i + k); } return String.valueOf(ch); } private void rev(char[] ch, int i, int j) { j = Math.min(ch.length, j) - 1; for (; i < j; i++, j--) { char tmp = ch[i]; ch[i] = ch[j]; ch[j] = tmp; } }