java算法竞赛:StringBuilder更省空间更快速

参考文章:Java StringBuffer 和 StringBuilder 类
     String、StringBuffer与StringBuilder之间区别

用java写代码时,总会一不小心超出内存限制,这时候就需要摒弃String,考虑多使用可变长字符串了。

String:每次拼接都会生成个新的变量,遇见多次拼接的情况极容易超出内存限制!
StringBuffer:改变字符串,不产生新的对象,线程安全。
StringBuilder:改变字符串,不产生新的对象,线程不安全,但是速度更快!因为算法竞赛中通常不涉及多线程,所以一般情况使用StringBuilder!

StringBuffer类和StringBuilder类的方法几乎一样,所以在此列出StringBuilder的方法,同样适用于StringBuffer类

        // 此处仅举例常用的方法,如果后续有其他方法常用,我再来进行补充
        // 创建StringBuilder变量
        StringBuilder stringBuilder = new StringBuilder();
        // append()         拼接
        stringBuilder.append("abcde");                      // abcde
        // insert()         插入
        stringBuilder.insert(5,"f");           			    // abcdef
        // deleteCharAt()   删除指定位置的字符
        stringBuilder.deleteCharAt(1);                      // acdef
        // delete()         删除一段字符,【左,右)
        stringBuilder.delete(0,2);                          // def
        // length()         获取字符串长度
        System.out.println(stringBuilder.length());         // 3

题目测试:P1706 全排列问题

用String时,超出内存限制。
用StringBuffer,时间大约是334ms
用StringBuilder,时间大约是296ms

代码如下,大家可以自行测试:

package 算法竞赛;

import java.io.*;

public class Interface1{
    
    
    // 静态的成员变量看作是全局变量理解就好了
    static int k = 1;
    static int[] pd = new int[12];
    static int[] cc = new int[12];
    static StringBuilder stringBuffer = new StringBuilder();
    static BufferedReader ins = new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer in = new StreamTokenizer(ins);
    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException{
    
    
        in.nextToken();
        int n = (int)in.nval;
        dfs(1,n);
        out.println(stringBuffer);
        out.close();
    }

    // 这种方法真是妙啊,以后要多用递归啊
    public static void dfs(int t,int n){
    
    
        if(t>n)
        {
    
    
            out(n);
        }
        for(int i = 1;i<=n;i++)
        {
    
    
            if(pd[i]==0)
            {
    
    
                cc[k]=i;
                k++;
                pd[i]=1;
                dfs(t+1,n);
                pd[i]=0;
            }
        }
        k--;
    }

    public static void out(int n){
    
    
        for(int i = 1;i<=n;i++)
        {
    
    
            stringBuffer.append("    ").append(cc[i]);
        }
        stringBuffer.append("\n");
    }
}

如有谬误,请务必告知,以免误导他人
如果各位看官觉得写得不错,对你有帮助,能不能给个赞啊,这是对我最大的鼓励!

猜你喜欢

转载自blog.csdn.net/weixin_51304266/article/details/121322611