1. 替换数字
很多数组填充类问题,其做法都是先预先给数组扩容到填充后的大小,然后再从后向前操作。
这么做有两个好处:
1.不用申请新数组。
2.从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
Java中一定要使用辅助空间,因为Java里的String不能修改。
//ACM模式下,Java输入
public static void main (String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.next();
System.out.println(replaceNumber(s));
scan.close();
}
StringBuilder buffer = new StringBuilder("");
buffer.append(""); //添加
buffer.toString(); //StringBuilder 转为 String
2.反转字符串中的单词
在去除多余空格(removeSpace)的方法中,while的条件应该是
while(start <= end)
private 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();
while(start <= end){
char c = s.charAt(start);
if(c != ' ' || sb.charAt(sb.length() - 1) != ' '){
sb.append(c);
}
start++;
}
return sb;
}
在反转每个单词(reverseEachWords)的方法中,内层while的条件为
while(end < n && sb.charAt(end) != ' ')
end < n 容易忘记
private void reverseEachWords(StringBuilder sb){
int start = 0;
int end = 1;
int n = sb.length();
while(start < n){
while(end < n && sb.charAt(end) != ' '){
end++;
}
reverseString(sb, start, end - 1);
start = end + 1;
end = start + 1;
}
}
3.右旋字符串
本题为卡码网题目,使用ACM模式答题。在提交时遇到
Non-static method ‘xxx()‘ cannot be referenced from a static context 报错
报错的原因是在静态(main)方法中使用了非静态方法,将非静态方法变为静态方法后,提交通过。
参考内容:
在 Java 中,静态方法是与类关联的方法,可以直接通过类名调用,而不需要创建类的实例对象。而非静态方法是与实例对象关联的方法,需要通过实例对象来调用。
4.重复的子字符串 leetcode 459
KMP算法
关键的判断条件 if(next[len - 1] > 0 && (len % (len - next[len - 1]) == 0))
class Solution {
public boolean repeatedSubstringPattern(String s) {
int len = s.length();
int[] next = new int[len];
next[0] = 0;
int j = 0;
if(len == 0) return false;
//计算前缀表
for(int i = 1;i < len;i++){
while(j > 0 && s.charAt(i) != s.charAt(j)){
j = next[j - 1];
}
if(s.charAt(i) == s.charAt(j)){
j++;
}
next[i] = j;
}
//判断
if(next[len - 1] > 0 && (len % (len - next[len - 1]) == 0)){
return true;
}else{
return false;
}
}
}