[力扣]443. 压缩字符串

给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。数组的每个元素应该是长度为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()

1append(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;//不对

而是遍历再把相应赋值!

发布了14 篇原创文章 · 获赞 27 · 访问量 2218

猜你喜欢

转载自blog.csdn.net/qq_45619426/article/details/104251770