#题目:
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串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):把字符串常量值转成字符串
学到了!