现给定一个string iniString字符串(长度小于等于10000),请按连续重复字母压缩的方式将该字符串压缩,返回结果为string,比如,字符串“aabbcccccaaa”经压缩会变成“a2b2c5a3”,若压缩后的字符串没有变短,则返回原先的字符串。注意保证串内字符均由大小写英文字母组成。
现给定一个string iniString字符串(长度小于等于10000),请按连续重复字母压缩的方式将该字符串压缩,返回结果为string,比如,字符串“aabbcccccaaa”经压缩会变成“a2b2c5a3”,若压缩后的字符串没有变短,则返回原先的字符串。注意保证串内字符均由大小写英文字母组成。
"aabcccccaaa"
"a2b1c5a3"
"welcometonowcoderrrrr"
"welcometonowcoderrrrr"
welcometonowcoderrrrr转换成重复字母压缩的结果是w1e1l1c1o1m1e1t1o1n1o1w1c1o1d1e1r5,比原字符串的长度还要长,所以返回原先的字符串。
class Zipper {
public:
string zipString(string iniString) {
string str;
int i = 0,j = 0;
while (i < iniString.length()){
while (iniString[i] == iniString[j]) i++;
str += iniString[j];
str += to_string(i-j);
j = i;}
if (iniString.length() < str.length()) return iniString;
else return str;
}
};
import java.util.*;
//while (i < iniString.length()-1 && iniString.charAt(i+1) == iniString.charAt(i))中的代码是关键
//大家很多遇到的字符串越界关键在此。iniString.charAt(i+1) == iniString.charAt(i)与i < iniString.length()-1 顺序反过来就错了
public class Zipper {
public String zipString(String iniString) {
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < iniString.length(); i++) {
char temp = iniString.charAt(i);
int count = 1;
while (i < iniString.length()-1 && iniString.charAt(i+1) == iniString.charAt(i)) {
count ++;
i ++;
}
stringBuffer.append(temp).append(count);
}
return iniString.length() > stringBuffer.length() ? stringBuffer.toString() :iniString;
}
}
主要思路:使用一个中间变量strCnt表示字符的数量,如果下一个字符与当前的字符不相等,把strCnt置为1即可。遍历完字符串,结果出就出来了。
class Zipper:
def zipString(self, iniString):
zipStr = ""
strCnt = 1
for i in range(len(iniString) - 1):
if iniString[i + 1] == iniString[i]:
strCnt += 1
else:
zipStr += iniString[i] + str(strCnt)
strCnt = 1
zipStr += iniString[-1] + str(strCnt)
return zipStr if len(zipStr) < len(iniString) else iniString
//引入一个计数器k就可以了
public class Zipper {
public String zipString(String iniString) {
StringBuffer sb = new StringBuffer();
int k = 1;
for(int i = 0; i < iniString.length() - 1; i++){
if(iniString.charAt(i) == iniString.charAt(i+1))
k++;
else {
sb.append(iniString.charAt(i));
sb.append(k);
k = 1;
}
}
sb.append(iniString.charAt(iniString.length() - 1));
sb.append(k);
if(sb.length() >= iniString.length())
return iniString;
return sb.toString();
}
}
import java.util.*;
public class Zipper {
public String zipString(String iniString) {
char[] c = iniString.toCharArray();
String str2 = "";
for(int i=0; i<c.length-1; i++){
int count = 1;
int index = i;
for(int j=i+1; j<c.length; j++){
if(c[j] == c[i]){
count ++;
index = j; //标记与位置i处的字符一样的最后下标
}else{
break;
}
}
str2 += c[i] + "" + count; //+"" : 变为字符串
i = index; //i直接跳至最后下标处,因为下个循坏前i++,所以i的实际跳转位置是index+1
}
return str2.length() < iniString.length() ? str2 : iniString;
}
}
class Zipper {
public:
string zipString(string iniString) {
string s ;
int cnt = 0;
for(int i = 0; i < iniString.length(); ++i){
cnt = 1;
while(i + 1 < iniString.length() && iniString[i] == iniString[i+1]) {
cnt ++;
i++;
}
s += iniString[i];
s += to_string(cnt);
}
if(iniString.size() > s.size()) return s;
return iniString;
}
};
}
import java.util.*;
/**
标签
*/
/*//这种只适合前面出现后面不出现的字符串
public class Zipper {
public String zipString(String iniString) {
// write code here
if(iniString.length()<=2)return iniString;
StringBuffer sb = new StringBuffer();
int sIndex = 0;
int n = iniString.length();
while(sIndex < n){
char ch = iniString.charAt(sIndex);
int eIndex = iniString.lastIndexOf(ch);
if(sIndex==eIndex){
sb.append(ch);
sIndex++;
}else{
sb.append(ch);
sb.append(eIndex-sIndex + 1);
sIndex = eIndex+1;
}
}
if(n<=sb.length())
return iniString;
else
return sb.toString();
}
}*/
public class Zipper {
public String zipString(String iniString) {
// write code here
if(iniString.length()<=2)return iniString;
StringBuffer sb = new StringBuffer();
int sIndex = 0;
int n = iniString.length();
while(sIndex < n){
char ch = iniString.charAt(sIndex);
int temp = 0;
while(sIndex < n && ch==iniString.charAt(sIndex)){
temp++;
sIndex++;
}
sb.append(ch);
sb.append(temp);
}
if(n<=sb.length())
return iniString;
else
return sb.toString();
}
} class Zipper {
public:
string zipString(string iniString) {
long int num=0,i=0,k=1;
string temp;
num=iniString.size();
for ( i = 1; i < num; i++)
{
if (iniString[i] != iniString[i-1])
{
temp += iniString[i-1] ;
if(k>9)
{
temp += to_string(k);
}
else
{
temp += k+'0';
}
k=1;
}
else if (iniString[i] == iniString[i-1])
{
k++;
}
if (i== num-1)
{
temp += iniString[i];
if(k>9)
{
temp += to_string(k);
}
else
{
temp += k+'0';
}
}
}
if (temp.size()<=iniString.size())
{
return temp;
}
return iniString;
}
}; public class Zipper {
public String zipString(String iniString) {
StringBuffer res = new StringBuffer();
StringBuffer tmp = new StringBuffer(); //用来存放一组相同的字符
tmp.append(iniString.charAt(0));
for(int i=1; i<iniString.length(); i++) {
//如果当前字符与前一个字符相同,则存入tmp中
if(iniString.charAt(i) == iniString.charAt(i-1)) {
tmp.append(iniString.charAt(i));
}else { //如果当前字符与前一个字符不相同,将tmp中的首字符以及tmp长度加入res中
res.append(tmp.charAt(0));
res.append(tmp.length());
tmp.setLength(0);
tmp.append(iniString.charAt(i));
}
}
if(tmp.length() != 0) { //将最后一组tmp字符值存入res中
res.append(tmp.charAt(0));
res.append(tmp.length());
}
//如果压缩后的长度变小,则返回压缩后的字符串,否则返回原字符串
if(res.length() < iniString.length()) return res.toString();
return iniString;
}
}
# -*- coding:utf-8 -*- class Zipper: def zipString(self, iniString): pre = '' cnt = 0 ss = '' for s in iniString: if s == pre: cnt += 1 else: if pre: ss += pre + str(cnt) pre = s cnt = 1 ss += pre + str(cnt) if len(ss) < len(iniString): return ss else: return iniString
运行时间:60ms
占用内存:5852k
public class Zipper {
public static String zipString(String iniString) {
String temp1=iniString+";";
StringBuffer temp2=new StringBuffer();
int count=1;
for(int i=1;i<temp1.length();i++) {
if(temp1.charAt(i)==temp1.charAt(i-1)&& i<temp1.length()-1) {
count++;
}else{
temp2.append(iniString.charAt(i-1));
temp2.append(count);
count=1;
}
}
if(temp2.length()>=temp1.length()) {
return iniString;
}
return temp2.toString();
}
}
import java.util.*;
public class Zipper {
public String zipString(String iniString) {
int count = 1;
char a = ' ';
StringBuffer sb = new StringBuffer();
for(int i = 1; i < iniString.length(); i++) {
a = iniString.charAt(i-1);
if(a == iniString.charAt(i)) {
count++;
}else {
sb.append(a).append(count);
count = 1;
}
}
if(iniString.length() < sb.length()) return iniString;
else return sb.append(a).append(count).toString();
}
}
import java.util.*;
public class Zipper {
public static String zipString(String iniString) {
// write code here
StringBuilder result = new StringBuilder();
int count = 1;
int i = 1;
while (i < iniString.length()) {
if (iniString.charAt(i - 1) == iniString.charAt(i)) {
count++;
} else {
result.append(iniString.charAt(i - 1));
result.append(count);
count = 1;
}
//最后一个字符判断不了,重新加载一次
if (i == iniString.length() - 1) {
result.append(iniString.charAt(i - 1));
result.append(count);
}
i++;
}
if (result.length() > iniString.length()) {
return iniString;
}
return String.valueOf(result);
}
}
//扫描一遍,边扫描边保存压缩后的字符串,最后比较和原来的长度相比有没有变短,
//决定返回压缩后的字符串或者原串。
class Zipper {
public:
string zipString(string iniString) {
int n = iniString.size();
if (n == 0)
return iniString;
string s;
int i = 0;
char tmp;
while (i<n) {
tmp = iniString[i];
int cnt1 = 0;
while (i<n&&tmp == iniString[i]) {
i++;
cnt1++;
}
s += tmp;
s += to_string(cnt1);
}
return ((s.size()<n) ? s : iniString);
}
}; import java.util.*;
public class Zipper {
public String zipString(String iniString) {
StringBuffer sb = new StringBuffer();
char[] strArr = iniString.toCharArray();
int index = 1;
boolean f = true;
for (int i = 0; i < strArr.length; i++) {
char m = strArr[i];
char n;
try {
n = strArr[i+1];
} catch (Exception e) {
sb.append(m+""+(index));
if(f){
return iniString;
}else{
return sb.toString();
}
}
if(m!=n){
sb.append(m+""+(index));
index=1;
}else{
f = false;
index++;
}
}
if(f){
return iniString;
}else{
return sb.toString();
}
}
}
两个列表,一个用来输出原始字符串,一个用来输出改变后的字符串; 属于暴力破解:
# -*- coding:utf-8 -*-
class Zipper:
def zipString(self, iniString):
# write code here
iniString = list(iniString)
resultlst1 = []
resultlst2 = []
count = 0
lens = len(iniString)
i = 0
while i < lens:
j = i + 1
resultlst1.append(iniString[i])
count += 1
while j < lens and iniString[i] == iniString[j]:
count += 1
j += 1
else:
resultlst1.append(str(count))
resultlst2.append(str(count))
i = j
count = 0
if len(resultlst2) == lens:
return ''.join(iniString)
return ''.join(resultlst1)
import java.util.*; public class Zipper { public String zipString(String iniString) { // write code here if(iniString==null||iniString.trim().length()==0){ return ""; } StringBuilder strB = new StringBuilder(""); char[] iniStr = iniString.toCharArray(); char pre; pre = iniStr[0]; int count = 1; for(int i = 1;i < iniStr.length; i++){ if(pre == iniStr[i]){ count++; }else{ strB.append(pre+""+count); pre = iniStr[i]; count = 1; } } strB.append(pre+""+count); if(strB.toString().length() >= iniString.length()){ return iniString; } return strB.toString(); } }