代码随想录开源LeetCode题单:代码随想录
LeetCode344
思路
双指针
定义两个指针,分别从字符串最左侧和最右侧向中间移动,同时交换元素,两指针相遇时说明反转完毕。
代码
class Solution {
public void reverseString(char[] s) {
int i = 0, j = s.length - 1;
while(i < j){
char temp = s[i];
s[i] = s[j];
s[j] = temp;
i++; j--;
}
}
}
LeetCode541
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
思路
将字符串每2k个元素分为一组,组内进行反转操作。
代码
class Solution {
public String reverseStr(String s, int k) {
char[] c = s.toCharArray();
// 字符串转为字符数组后,每2k个元素分为一组,组内进行反转
for( int i = 0; i < c.length; i += 2 * k){
int left = i;
int right = Math.min(c.length - 1, left + k -1);
while(left < right){
char temp = c[left];
c[left] = c[right];
c[right] = temp;
left++;
right--;
}
}
return new String(c);
}
}
KamaCoder54
StringBuilder
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
StringBuilder sb = new StringBuilder();
char[] ch = sc.nextLine().toCharArray();
for(char c : ch) {
if(c >= 'a' && c <= 'z') {
sb.append(c);
} else {
sb.append("number");
}
}
System.out.println(sb.toString());
}
return;
}
}
扩容
import java.util.Scanner;
public class Main {
public static String replaceNumber(String s) {
int count = 0; // 统计数字的个数
int sOldSize = s.length();
for (int i = 0; i < s.length(); i++) {
if(Character.isDigit(s.charAt(i))){
count++;
}
}
// 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
char[] newS = new char[s.length() + count * 5];
int sNewSize = newS.length;
// 将旧字符串的内容填入新数组
System.arraycopy(s.toCharArray(), 0, newS, 0, sOldSize);
// 从后先前将空格替换为"number"
for (int i = sNewSize - 1, j = sOldSize - 1; j < i; j--, i--) {
if (!Character.isDigit(newS[j])) {
newS[i] = newS[j];
} else {
newS[i] = 'r';
newS[i - 1] = 'e';
newS[i - 2] = 'b';
newS[i - 3] = 'm';
newS[i - 4] = 'u';
newS[i - 5] = 'n';
i -= 5;
}
}
return new String(newS);
};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
System.out.println(replaceNumber(s));
scanner.close();
}
}