面试题01.06.字符串压缩。2星

#题目:
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
#示例1:
输入:“aabcccccaaa”
输出:“a2b1c5a3”
#示例2:
输入:“abbccd”
输出:“abbccd”
解释:“abbccd"压缩后为"a1b2c2d1”,比原字符串长度更长。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/compress-string-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一:

public class stringzip {
    public String compressString(String S){
        if(S.length() == 0){return S;}
        String rS = "";
        char a=S.charAt(0);
        int anum = 1;
        for(int i=1;i<S.length();i++){
            if(S.charAt(i) == a){
                anum++;
            }
            else{
                rS=rS+a+anum;
                a=S.charAt(i);
                anum=1;
            }
        }
        rS=rS+a+anum;
        if(rS.length()<S.length()){return rS;}
        else{return S;}
    }
    public static void main(String arg[]){
        System.out.println(new stringzip().compressString("abbccd"));
    }
}

第一次写的方法,效率较低。
首先判空,然后建立一个返回字符串,一个记录字符,一个字符数记录,利用for循环依次遍历字符串中的每个字符,如果正在遍历的字符和上一个字符相同,则计数加1,否则将字符和计数追加到返回字符串,然后记录新的字符,计数归,最后比较压缩前后字符串长短,返回结果。

方法二:
对题解大佬的学习。

class Solution {
 public String compressString(String S) {
        if (S.isEmpty()) {
            return S;
        }//判空
        StringBuilder builder = new StringBuilder();//建一个StringBuilder变量
        builder.append(S.charAt(0));//首先将第一个字符添加到StringBuilder
        int count = 1;//计数为1
        for (int i = 1; i < S.length(); ++i) {
            if (builder.charAt(builder.length() - 1) == S.charAt(i)) {
            //如果StringBuilder最后一个字符与当前遍历的字符相同
                ++count;//计数加1
            } else {//否则
                builder.append(count);//将计数添加到StringBuilder
                count = 1;//计数归1
                builder.append(S.charAt(i));//添加下一个字符到StringBuilder尾
            }
        }
        builder.append(count);//添加最后一个计数
        return builder.length() >= S.length() ? S : builder.toString();
       //StringBuilder长度大于等于原字符串长度?为真返回原字符串:为假,将StringBuilder转为字符串类型然后返回
    }
}

StringBuider,类字符串生成器,头文件java.lang.StringBuilder,可变的字符序列。这个类提供了一个与StringBuffer,但不能保证同步。此类旨在用作的插件替代StringBuffer在单线程使用字符串缓冲区的地方(通常情况下)。在可能的情况下,建议优先使用该类StringBuffer因为在大多数实现下会更快。
[https://docs.oracle.com/javase/6/docs/api/java/lang/StringBuilder.html?is-external=true]
append(char c)
Appends the string representation of the char argument to this sequence.
添加字符自变量参数的字符串表示到这个序列。
把字符参数转为字符串类型并追加到序列。
toString()
Returns a string representing the data in this sequence.
返回一个字符串表示的数据在这个序列。X
返回表示该序列中数据的字符串。V

方法三:
对题解大佬的学习。

class Solution {
    public String compressString(String S) {
        char[] cs = new char[S.length()];//创建一个和原字符串等长的字符数组cs
        int k = 0;//记录已存入字符的数量
        for (int i = 0; i < S.length() && k < cs.length; ) {
        //遍历参数字符串,并确保在存放数据不超过字符数组大小的情况下
            cs[k++] = S.charAt(i);//存放字母字符
            int len = 0;//计数归零
            for (int j = i; j < S.length(); j++) {//内循环,计数相同字符
                if (S.charAt(j) == S.charAt(i)) len++;//相同则计数增加
                else break;//否则推出循环
            }
            char[] ns = Integer.toString(len).toCharArray();
            //声明字符数组,并将计数转为字符数,可能为两位数,所以转为字符数组存放
            for (int n = 0; n < ns.length && k < cs.length; k++, n++) {//将存放计数的字符串数组赋值给cs数组
                cs[k] = ns[n];
            }
            i = i + len;//跳过已遍历的字符
        }
        if (k < cs.length) return new String(cs, 0, k);
        //如果压缩后小于原长度,调用一个三参的String构造方法,将字符数组cs的0到k位字符转为字符串类型,并返回
        return S;
    }
}

Integer.toString(len)
该方法将整型转为字符串类型
.toCharArray()
该方法的作用是返回一个字符数组,该字符数组中存放了当前字符串中的所有字符

以下转自:https://www.e-learn.cn/content/java/2368574
public String():空构造
public String(byte[] bytes):把字节数组转成字符串
public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串
public String(char[] value):把字符数组转成字符串
public String(char[] value,int index,int count):把字符数组的一部分转成字符串
public String(String original):把字符串常量值转成字符串
学到了!

发布了18 篇原创文章 · 获赞 0 · 访问量 333

猜你喜欢

转载自blog.csdn.net/qq_44787671/article/details/104436123