首页 > 试题广场 >

压缩字符串(一)

[编程题]压缩字符串(一)
  • 热度指数:6988 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2bc5a3。
1.如果只有一个字符,1不用写
2.字符串中只包含大小写英文字母(a至z)。

数据范围:
0<=字符串长度<=50000

要求:时间复杂度O(N)
示例1

输入

"aabcccccaaa"

输出

"a2bc5a3"
示例2

输入

"shopeew"

输出

"shope2w"
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param param string字符串 
     * @return string字符串
     */
    public String compressString (String param) {
        // write code here
        char[] str_list = param.toCharArray();
        // 新建一个拼接字符串
        StringBuilder sb = new StringBuilder();
        if(str_list.length==0)return sb.toString();
        // point是数组下标
        int point = 0;
        // num是对用下表的数字出现多少次
        int num = 1;
        while(point<str_list.length-1){
            // 统计下标和出现此处
            if(str_list[point] == str_list[point+1]){
                point++;
                num++;
                // 如果只出现1次则不拼接1
            }else if(str_list[point] != str_list[point+1] && num == 1){
                sb.append(str_list[point]);
                point++;
                num=1;
                // 如果出现多次,则拼接相应个数
            }else if(str_list[point] != str_list[point+1] && num != 1){
                sb.append(str_list[point]).append(num);
                point++;
                num=1;
            }
        }
        // 追加最后一个字母
        if(num ==1){
            sb.append(str_list[str_list.length-1]);
        }else{
             sb.append(str_list[str_list.length-1]).append(num);
        }
       
        return sb.toString();
    }
}

发表于 2023-06-08 21:02:42 回复(0)
public class CompressString {
	public String compressString(String param) {
		// write code here
		if (param == null || param.length() == 0) {
			return "";
		}
		String returnString = "";
		char[] chars = param.toCharArray();
		for (int i = 0; i < chars.length; i++) {
			char temp = chars[i];
			int count = 1;
			int nextIndex = 0;
			for (int j = i + 1; j < chars.length; j++) {
				if (temp == chars[j]) {
					count++;
					if (j == chars.length - 1) {
						nextIndex = chars.length;
					}
					continue;
				} else {
					nextIndex = j - 1;
					break;
				}
			}
			if (count == 1) {
				returnString += String.valueOf(temp);
			} else {
				returnString += (String.valueOf(temp) + count);
				
			}
			if (nextIndex != 0 && nextIndex != chars.length - 1) {
				i = nextIndex;
			}
		}
		return returnString;
	}
}

发表于 2022-10-09 13:23:22 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param param string字符串
     * @return string字符串
     */
    public String compressString (String param) {
        // write code here
        StringBuilder sb = new StringBuilder();
        char arr[] = param.toCharArray();

        int temp = 1;//定义临时变量temp
        for (int i = 0; i < arr.length; i++) {
            if (i + 1 < arr.length && arr[i + 1] == arr[i]) {
                //后一个和当前相等时并且需要满足i+1不能溢出,temp+1
                temp++;
            } else {//不满足上述条件后判断temp,大于1直接加在后边,否则不加temp
                if (temp > 1) {
                    sb.append(arr[i]).append(temp);
                    temp = 1;//还原temp的值
                } else {
                    sb.append(arr[i]);
                }
            }
        }
        return sb.toString();
    }
}

发表于 2022-10-05 19:26:32 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param param string字符串
     * @return string字符串
     */
    public String compressString (String param) {
        // write code here
        if (param.equals("")) return "";
        StringBuffer sb = new StringBuffer();
        int i = 0, j = 0;
        for (; j < param.length(); j ++) {
            if (param.charAt(j) == param.charAt(i)) {
                continue;
            } else {
                sb.append(param.charAt(i));
                if (j - i != 1) {
                    sb.append(j - i);
                }
                i = j;
            }
        }
        sb.append(param.charAt(i));
        if (j - i != 1) {
            sb.append(j - i);
        }
        return sb.toString();
    }
}

发表于 2022-09-12 21:27:23 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param param string字符串
     * @return string字符串
     */
    public String compressString (String param) {
        // write code here
        if (param.equals("") || param.length() == 1) {
            return param;
        }
        // 某个单词的长度
        int num = 1;
        // 第一个字符
        char c = param.charAt(0);
        StringBuffer sb = new StringBuffer();
        for (int i = 1; i < param.length(); i++) {
            if (c == param.charAt(i)) {
                num++;
            } else {
                sb.append(c);
                if (num > 1) {
                    sb.append(num);
                }
                num = 1;
                c = param.charAt(i);
            }
            if (i == param.length() - 1) {
                sb.append(c);
                if (num > 1) {
                    sb.append(num);
                }
            }
        }
        return sb.toString();
    }
}

发表于 2022-05-27 15:22:40 回复(0)
这个应该是双指针吧?
public String compressString(String param) {
        StringBuilder sb = new StringBuilder();
        int len = param.length(), i = 0;
        while (i < len) {
            int j = i, count = 0;
            while (i < len && j < len && param.charAt(j) == param.charAt(i)) {
                j++;
                count++;
            }
            if (count == 1) {
                sb.append(param.charAt(i));
            } else {
                sb.append(param.charAt(i)).append(count);
            }
            i = j;
        }
        return sb.toString();
    }


发表于 2022-03-20 09:03:44 回复(0)
public String compressString (String param) {
        // write code here
        int length = param.length();
        if(length == 1 || param == null){
            return param;
        }
        String str = "";
        int k = 1;
        int prev = 0;
        for (int i = 0; i < length-1 ; i=prev) {
            for (int j = i+1; j < length; j++) {
                if (j<length-1){
                    if (param.charAt(i)==param.charAt(j)) {
                        k++;
                    } else {
                        prev = j;
                        String temp = String.valueOf(k);
                        str+=param.charAt(i);
                        if (!temp.equals("1")){
                            str+=temp;
                        }
                        k=1;
                        j=length;
                    }
                } else {
                    prev = j;
                    if (param.charAt(i)==param.charAt(j)) {
                        k++;
                        String temp = String.valueOf(k);
                        str+=param.charAt(i);
                        str+=k;
                    } else {
                        String temp = String.valueOf(k);
                        str+=param.charAt(i);
                        if (!temp.equals("1")){
                            str+=temp;
                        }
                        str+=param.charAt(j);
                    }
                    j=length;
                }
                
            }
        }
        return str;
    }

发表于 2022-01-19 15:54:53 回复(0)

简单题就要简单代码

import java.util.*;

public class Solution {

    public String compressString (String param) {
        StringBuilder builder = new StringBuilder();
        int count=0;
        for (int i = 0; i < param.length(); i++) {
            count++;
            if (i==param.length()-1 || param.charAt(i)!=param.charAt(i+1)) {
                builder.append(param.charAt(i));
                if (count>1) builder.append(count);
                count=0;
            }
        }
        return builder.toString();
    }
}
发表于 2022-01-18 10:56:48 回复(0)
public String compressString (String param) {
        // write code here
        if(param.length() == 1){
            return String.valueOf(param.charAt(0));
        }
        String res = ""; //用于存储最后的结果
        for(int i = 0 ; i < param.length(); i ++){
            int count = 1;//每遍历一个元素,默认都是次数1
            int j = 0;
            //此时如果剩下最后一个,就不必与后面的进行比较了
            if(i == param.length() - 1){
                res = res + param.charAt(i);
                break;
            }
            //如果当前的与后面一个相等,那么就继续让后面的那个一直往后遍历
            //遍历到与后一个不相等
            if(param.charAt(i) == param.charAt(i + 1)){
                count ++;
                j = i + 1;
                while(j < param.length() - 1  &&  param.charAt(j) == param.charAt(j + 1)){
                    j ++;
                    count ++;
                }
                res = res + param.charAt(i) + count  ;
                i = j;//跳出循环后,让下一次i从j开始遍历,跳过中间重复的
            }else{
                //不相等,直接存
                res = res + param.charAt(i);
            }
        }
        return res;
    }

发表于 2022-01-08 22:33:35 回复(0)

问题信息

上传者:小小
难度:
10条回答 3754浏览

热门推荐

通过挑战的用户

查看代码