给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。在完成原地修改输入数组后,返回数组的新长度。
该题目来自力扣题库
示例
示例 1:
输入:[“a”,“a”,“b”,“b”,“c”,“c”,“c”]
输出:返回6,输入数组的前6个字符应该是:[“a”,“2”,“b”,“2”,“c”,“3”]
"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。
示例 2:
输入:[“a”]
输出:返回1,输入数组的前1个字符应该是:[“a”]
没有任何字符串被替代。
示例 3:
输入:[“a”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”]
输出:返回4,输入数组的前4个字符应该是:[“a”,“b”,“1”,“2”]。
由于字符"a"不重复,所以不会被压缩。"bbbbbbbbbbbb"被“b12”替代。
注意每个数字在数组中都有它自己的位置。
思路
创建Stringbuilder对象str
为了防止下面代码出现数组溢出的情况,所以前面就要设置一些条件。如果数组chars的长度是0,返回0;如果数组chars的长度是1,返回1.
下来的情况就是chars的长度大于一的情况
设一个当前字符出现几次的变量temp初始化为0
设置循环 让当前位置和当前位置+1的位置比较是否一样,如果一样那么temp加1
,如果不一样就把当前位置上的字符连接,如果temp大于0(就是当前字符出现了至少2次)就会把这个次数也连接,即连接temp+1。
如果循环结束,这个i所在的位置就是chars.length,chars数组中让i-1位与最后一位指的字符比较,如果二者相同,那么连接的是chars的最后一位和temp+1.
如果二者不同,那么只连接数组的最后一位。
代码
class Solution {
public int compress(char[] chars) {
StringBuilder str=new StringBuilder();
if(chars.length==0){
return 0;
}
if(chars.length==1){
return 1;
}
int temp=0;
int i=0;
for(;i<chars.length-1;i++){
if(chars[i]==chars[i+1]){
temp++;
}else{
str.append(chars[i]);
if(temp>0){
str.append((temp+1));
}
temp=0;
}
}
i--;
int len=chars.length-1;
if(chars[len]==chars[i]){
str.append(chars[i]);
if(temp>0){
str.append((temp+1));
}
}else{
str.append(chars[len]);
}
char[] char1=str.toString().toCharArray();
for(i=0;i<char1.length;i++){
chars[i]=char1[i];
}
return char1.length;
}
}
总结
StringBuilder类实例化一个对象是很好用的,StringBuilder类里面的方法我们可以用到
创建Stringbuilder对象
StringBuilder strB = new StringBuilder();
字符串连接 append()
1、append(String str)/append(Char c);字符串连接
System.out.println("StringBuilder:"+strB.append("ch").append("111").append('c'));
//return "StringBuilder:ch111c"
返回一个与构建起或缓冲器内容相同的字符串 toString()
System.out.println("String:"+strB.toString());
//return "String:ch111c"
将第 i 个代码单元设置为 c setCharAt()
strB.setCharAt(2, 'd');
System.out.println("StringBuilder.setCharAt:" + strB);
//return "StringBuilder.setCharAt:chd11c"
数组拷贝问题
数组拷贝有两种
1.深拷贝:本来有一个数组,创建一个新的数组,新数组与旧数组内容相同。
2.浅拷贝:只有一个数组,只是多创建了一个引用。
比如有两个整型数组 a1和a2 .如果想把 a2的所有元素都放在a1上。
这样的写法是不对的
a1=a2;//不对
而是遍历再把相应赋值!