LeetCode 的344 题。
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
提示:
- 1 <= s.length <= 105
s[i]
都是 ASCII 码表中的可打印字符
示例1:
1 2
| 输入:["h","e","l","l","o"] 输出:["o","l","l","e","h"]
|
示例2:
1 2
| 输入:["H","a","n","n","a","h"] 输出:["h","a","n","n","a","H"]
|
思路
1.字符串是奇数个,则最后,中间位置的那个是不需要交换的。如果是偶数个,所有位置交换一遍就完成了。
2.这个方法的使用的是首尾逐渐向中间位置的元素递增交换的过程。
分解过程
[1][2][3][4][5][6][7]
[7][2][3][4][5][6][1]
[7][6][3][4][5][2][1]
[7][6][5][4][3][2][1]
解题实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
public class Solution { public static void main(String[] args) { reverseString("abcdefg".toCharArray()); }
public static void reverseString(char[] s) { for (int i = 0;i < s.length;i++) { int k = s.length - i - 1; if (k < s.length / 2) break; char ch = s[i]; s[i] = s[k]; s[k] = ch; } System.out.println(Arrays.toString(s)); } }
|
分解过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public static void reverseString(char[] s) { System.out.println("字符串总长度: " + s.length); for (int i = 0; i < s.length; i++) { int k = s.length - i - 1; if (k < s.length / 2) { System.out.println("break---> k: " + k + ", s.length / 2: " + s.length / 2 + ", i: " + i); break; } else { System.out.println("元素[" + k + "] 和 元素[" + i + "] 交换"); } char ch = s[i]; s[i] = s[k]; s[k] = ch; } System.out.println(Arrays.toString(s)); }
|