利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2bc5a3。
1.如果只有一个字符,1不用写
2.字符串中只包含大小写英文字母(a至z)。
1.如果只有一个字符,1不用写
2.字符串中只包含大小写英文字母(a至z)。
数据范围:
0<=字符串长度<=50000
要求:时间复杂度O(N)
"aabcccccaaa"
"a2bc5a3"
"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(); } }
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; } }
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(); } }
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(); } }
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(); } }
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(); }
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; }
简单题就要简单代码
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(); } }
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; }