344.反转字符串
class Solution {
public void reverseString(char[] s) {
// 双指针法
int i,j;
for(i = 0,j = s.length-1; i < s.length/2;i++,j--){
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
541. 反转字符串II
class Solution {
public String reverseStr(String s, int k) {
// 每2k个反转前k个,位数不够k个全部反转
char[] ch = s.toCharArray();
int size = ch.length;
for(int i = 0;i < size;i += 2 * k){
int start = i;
// 若尾数不够k个则用字符串的end代替
int end = Math.min(size - 1,start + k - 1);
// 字符异或实现反转字符串
while(start < end){
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}
return new String(ch);
}
}
卡码网:54.替换数字
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
char[] sin = s.toCharArray();
// 记录数字的个数
int count = 0;
int size1 = sin.length;
for(int i = 0; i < size1;i++){
if(sin[i] >= '0' && sin[i] <= '9'){
count++;
}
}
int size2 = size1 + count * 5;
char[] res = new char[size2];
for(int i = size2 - 1, j = size1 - 1; i >= 0; i--,j--){
// 若为字符,则直接写进结果集
if(sin[j] > '9' || sin[j] < '0'){
res[i] = sin[j];
}else{
res[i] = 'r';
res[i-1] = 'e';
res[i-2] = 'b';
res[i-3] = 'm';
res[i-4] = 'u';
res[i-5] = 'n';
i -= 5;
}
}
String ans = new String(res);
System.out.println(ans);
}
}
/**************************************************************
Problem: 1064
User: odCYZ6iCNFHfVk4tyRWaTV8nnSo0 [walkerLing]
Language: Java
Result: 正确
Time:1382 ms
Memory:13516 kb
****************************************************************/
151.翻转字符串里的单词
class Solution {
// 不使用java内置方法
// 1、去除首尾一级中间多余空格
// 2、反转整个字符串
// 3、反转各个单词
// 主函数,
public String reverseWords(String s) {
// 去除空格
StringBuilder sb = removeSpace(s);
// 反转整个字符串
reverseString(sb, 0, sb.length() - 1);
// 反转各个单词
reverseEachWord(sb);
return sb.toString();
}
// 移除空格
public StringBuilder removeSpace(String s){
int start = 0;
int end = s.length() - 1;
// 除掉开头的空格
while(s.charAt(start) == ' '){
start++;
}
// 除掉结尾的空格
while(s.charAt(end) == ' '){
end--;
}
// 现在只剩中间的空格
StringBuilder sb = new StringBuilder();
// 有可能start==end==' '
while(start <= end){
char c = s.charAt(start);
// debug点:
if(c != ' ' || sb.charAt(sb.length() - 1) != ' '){
sb.append(c);
}
start++;
}
return sb;
}
// 反转start-end整个字符串
public void reverseString(StringBuilder sb, int start,int end){
// 等于的时候不需要反转
while(start < end){
char temp = sb.charAt(start);
sb.setCharAt(start,sb.charAt(end));
sb.setCharAt(end,temp);
start++;
end--;
}
}
// 反转各个单词
public void reverseEachWord(StringBuilder sb){
int start = 0;
int end = 1;
int n = sb.length();
// debug点:
while(start < n){
//end定位到空格部位
while(end < n && sb.charAt(end) != ' '){
end++;
}
//前闭后闭
reverseString(sb, start, end - 1);
start =end + 1;
end = start + 1;
}
}
}
(tips:两个debug点尚未理解)
卡码网:55.右旋转字符串
import java.util.*;
import java.lang.*;
public class Main{
public static void main(String args[]){
// JavaString子串解法
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
String s = sc.next();
int n = s.length();
// 把k控制在字符串长度范围内
k = k % n;
//k之后的字符
String s1 = s.substring(n - k, n);
//k之前的字符
String s2 = s.substring(0, n - k);
StringBuilder sb = new StringBuilder();
sb.append(s1);
sb.append(s2);
System.out.println(sb.toString());
}
}
/**************************************************************
Problem: 1065
User: odCYZ6iCNFHfVk4tyRWaTV8nnSo0 [walkerLing]
Language: Java
Result: 正确
Time:1228 ms
Memory:13188 kb
****************************************************************/