18.14学习 日记
1.做了个回文子串的算法
自己做的性能又又又不行
以及收获一个感觉没用的知识点,估计就做题有用
while (scanner.hasNext())
-
scanner.hasNext()
-
缓存区有内容时,返回true,指针指向下一个内存块
-
但是,没有了也不会结束循环,所以我觉得没用
-
-
但是,他的带参重载方法有点用
- while (!scanner.hasNext("*"))
-
这样,输入某个字符串是*的时候会返回true,这样就能通过这个true结束循环
-
- while (!scanner.hasNext("*"))
下面是自己做的
import java.util.Scanner;
public class Demo_271 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (scanner.hasNext()) {
String s = input.next();
int num = s.length();
int flag = 2;
if(s.length()==0)
break;
while (true) {
if (flag>s.length()) {
break;
}
for (int i = 0; i < s.length(); i++) {
String s3 = s.substring(i,i+flag);
StringBuffer s2;
if(s3.length()%2==0){
s2 = new StringBuffer(s3.substring(s3.length()/2,s3.length()));
}else{
s2 = new StringBuffer(s3.substring(s3.length()/2+1,s3.length()));
}
s2.reverse();
String s4 = s2.toString();
String s5 = s3.substring(0,s3.length()/2);
if(s5.equals(s4)){
num++;
}
if(i+flag ==s.length()){
break;
}
}
flag++;
}
System.out.println(num);
}
}
}
参考答案
以某个字符为起点,长度像左边和右边往外一个一个加,再判断是否是回文串,不是就结束循环
package SF;
import java.util.Scanner;
public class Demo_271_2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String s = scanner.next();
System.out.println(getNum(s));
}
}
static int getNum(String s){
int n = s.length();
for (int i = 0; i < s.length(); i++) {
for (int l = i - 1, r = i + 1;
l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r); l--, r++, n++)
;
for (int l = i, r = i + 1;
l >= 0 & r < s.length() && s.charAt(l) == s.charAt(r); l--, r++, n++)
;
}
return n;
}
}
总结一下哪里比我的好
-
首先,遇到了以某个字符为起点的子串不是回文串,以这个字符为起点的父串就不再判断了
-
我的是每个子串都需要
-
其次 代码比我的简洁
2.学习了一个 ObjectOutputStream的reset()方法
重置将忽略已写入流的任何对象的状态。 状态重置为与新的ObjectOutputStream相同。 流中的当前点被标记为重置,因此相应的ObjectInputStream将在同一点重置。 先前写入流的对象将不会被称为已在流中。 它们将再次写入流中。
解决了我前面做作业遇到的传输HashMap时会缺少内容的情况
只需要在传输前调用这个方法