这道题意思是让字符数组逆序输出,通过第一个和倒数第一个,第二个和倒数第二个进行交换,以此类推……
public class Q344 {
public void reverseString(char[] s) {
int len = s.length;
int mid = len / 2;
for(int i = 0; i < mid; i++){
char temp = s[i];
s[i] = s[len - i - 1];
s[len-i-1] = temp;
}
}
}
方法法二:通过异或的性质来进行交换。 a ^ 0 = a ; a ^ 1 = ~a
public class Q344_2 {
public void reverseString(char[] s) {
int left = 0, right = s.length - 1;
// 假设s[left] 为 a, s[right] 为b
while(left < right){
s[left] ^= s[right]; // s[left] = a ^ b
s[right] ^= s[left]; // s[right] = b ^ a ^ b = a
s[left] ^= s[right]; // s[left] = a ^ b ^ a = b
left ++;
right --;
}
}
}
硬生生把一道简单题做成了复杂题,分享下自己代码
public class Q541 {
public String reverseStr(String s, int k) {
if(s.length() < k)
return reverseString(s);
StringBuilder res = new StringBuilder();
int times = s.length() / (k * 2); // 可以循环几次
int remainder = s.length() - times * k * 2; // 不能整除2 * k的余数
for(int i = 0; i < times; i++){
int reverseLeft = 2 * k * i, reverseRight = (2 * i + 1) * k;
int noReverseLeft = (2 * i + 1) * k, noReverseRight = 2 * (i + 1) * k;
res.append(reverseString(s.substring(reverseLeft,reverseRight)));
res.append(s.substring(noReverseLeft,noReverseRight));
}
if(remainder <= k)
res.append(reverseString(s.substring(times * 2 * k)));
else{
res.append(reverseString(s.substring(times * 2 * k,s.length() - remainder + k)));
res.append(s.substring(s.length()-remainder + k));
}
return res.toString();
}
public String reverseString(String s){
StringBuilder res = new StringBuilder();
for(int i = s.length() - 1; i >= 0; i--)
res.append(s.charAt(i));
return res.toString();
}
}
方法二:官方题解,看完发现自己真笨啊Leetcode官方题解
public class Q541_2 {
public String reverseStr(String s, int k) {
int len = s.length();
char[] arr = s.toCharArray();
for(int i = 0; i < len; i += 2 * k){
reverseString(arr, i, Math.min(i + k, len)-1);
}
return new String(arr);
}
public void reverseString(char[] arr, int left, int right){
while(left < right){
arr[left] ^= arr[right];
arr[right] ^= arr[left];
arr[left] ^= arr[right];
left++;
right--;
}
}
}
看到字符串替换的题,首先想到java 字符串内置了替换(replace)的方法,因此尝试使用正则表达式来进行替换,代码如下:
public class Offer05 {
public String replaceSpace(String s) {
if(s == null || s.length() == 0)
return s;
String reg = "\\s";
String res = s.replaceAll(reg,"%20");
return res;
}
}
方法二:一个字符一个字符进行比较,不是空格则添加该字符,是空格则添加%20
public class Offer05 {
public String replaceSpace(String s) {
if(s == null || s.length() == 0)
return s;
String reg = "\\s";
String res = s.replaceAll(reg,"%20");
return res;
}
}
这道题有一个陷阱,就是单词之间至少有一个空格,假设s = “hello world”; 如果直接使用s.split(“ ”),会出现如下结果
正确的做法是使用s.split(“//s+”),结果如下图所示
方法一:java内置方法
public class Q151 {
public String reverseWords(String s) {
String reg = "\\s+";
String[] arr = s.trim().split(reg);
StringBuilder res = new StringBuilder();
for(int i = arr.length - 1; i >= 0; i--){
res.append(arr[i]);
res.append(" ");
}
return res.toString().trim();
}
public static void main(String[] args) {
String s = "the sky is blue";
String res = new Q151().reverseWords(s);
System.out.println(res);
}
}
方法二:循环遍历
public class Q151_2 {
public String reverseWords(String s) {
s.trim();// 删除收尾空格
int j = s.length() - 1;
int i = j;
StringBuilder res = new StringBuilder();
while(i >= 0){
while(i >= 0 && s.charAt(i) != ' ')
i--;
// 添加单词
res.append(s.substring(i + 1, j + 1) + " ");
//跳过单词中的空格
while(i>= 0 && s.charAt(i) == ' ')
i--;
j = i; // 指向下一个单词的末尾
}
return res.toString().trim();
}
}