算法笔记3

StreamTokenizer 使用

注意:用JAVA解题一般用Scanner类来进行输入,但对时间要求严格的题,用它可能会超时,后改用StreamTokenizer类进行输入,后者处理输入的效率要高点。

类 java.io.StreamTokenizer 可以获取输入流,并将其分析为Token(标记),StreamTokenizer 的 nextToken方法读取下一标记

默认情况下,StreamTokenizer 认为下列内容是Token: 字母,数字,除c和c++注释符号以外的其他符号,如符号“/”不是Token,注释后的内容也不是,而 "/"是Token。单引号和双引号以及其总的内容只能算一个Token

为了提高效率,使用 BufferedReader ,如下,创建 StreamTokenizer 对象

StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)))

为了从流中获取标记,可以调用StreamTokenizer 的 nextToken() 方法。

调用nextToken()方法后,如果标记是字符串,可以用String s = st.sval ,如果是整数用 int n = (int)st.sval得到

st.nextTok();
int i = (int)st.nval;
st.nextToken();
int j = (int)st.nval;
st.nextToken();
String s = st.sval;

BuffeedRead类的使用

BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中。

1、public BufferedReader(Reader in) 构造方法 接收一个Reader类的实例

2、public String readLine() throws IOException 一次性从缓冲区中将内容全部读取进来。

BufferedReader buf = null ; // 声明对象
buf = new BufferedReader(new InputStreamReader(System.in)) ; // 将字节流变为字符流

StringBuilder类的使用

更易理解的菜鸟教程

https://www.runoob.com/java/java-stringbuffer.html

Java编译器对String做了特殊处理,使得我们可以直接用+拼接字符串。

考察下面的循环代码:

String s = "";
for (int i = 0; i < 1000; i++) {
    s = s + "," + i;
}

虽然可以直接拼接字符串,但是,在循环中,每次循环都会创建新的字符串对象,然后扔掉旧的字符串。这样,绝大部分字符串都是临时对象,不但浪费内存,还会影响GC效率。

为了能高效拼接字符串,Java标准库提供了StringBuilder,它是一个可变对象,可以预分配缓冲区,这样,往StringBuilder中新增字符时,不会创建新的临时对象:

StringBuilder sb = new StringBuilder(1024);
for (int i = 0; i < 1000; i++) {
    sb.append(',');
    sb.append(i);
}
String s = sb.toString();
StringBuilder还可以进行链式操作:
public static void main(String[] args) {
        var sb = new StringBuilder(1024);
        sb.append("Mr ")
          .append("Bob")
          .append("!")
          .insert(0, "Hello, ");
        System.out.println(sb.toString());
    }

你可能感兴趣的:(算法笔记3)