使用允许的有限字符压缩java中的字符串
我的一个朋友得到了这个。此外,他还被告知可以假设字符是字母a到z(大写或小写)。我写了以下内容,但我不知道如何使用关于字符串包含的有限字符(a到z)的假设。我是在没有意识到的情况下使用这个假设,还是我可以利用它使用允许的有限字符压缩java中的字符串,java,Java,我的一个朋友得到了这个。此外,他还被告知可以假设字符是字母a到z(大写或小写)。我写了以下内容,但我不知道如何使用关于字符串包含的有限字符(a到z)的假设。我是在没有意识到的情况下使用这个假设,还是我可以利用它 public static String compress(String str){ int count = 1; char c = str.charAt(0); StringBuffer result = new StringBuffer(); f
public static String compress(String str){
int count = 1;
char c = str.charAt(0);
StringBuffer result = new StringBuffer();
for (int i = 1; i < str.length();i++){
if (str.charAt(i) == c){
count++;
}
else{
String to_add = c + String.valueOf(count);
result.append(to_add);
count = 1;
c = str.charAt(i);
}
}
// last character
String to_add = c + String.valueOf(count);
result.append(to_add);
String result_str = result.toString();
// Check whether the compressed string is
// actually smaller than the original one
if (result_str.length() < str.length()){
return result_str;
}
else{
return str;
}
}
公共静态字符串压缩(字符串str){
整数计数=1;
字符c=str.charAt(0);
StringBuffer结果=新的StringBuffer();
对于(int i=1;i
'a'到'Z'是2*26=52
不同的字符,适合6位(2^6=64
)。你可以把代码点打包成六重奏
OTOH(您所编码的内容)仅适用于重复。如果你有像
abcde
这样的输入,它会变成1a1b1c1d1e
或类似的东西,效率很低,你很难称之为压缩。将每个字符分配给一个数字,例如a=1,z=26。所以,要表示这26个字符,至少需要5位
现在可以使用2个字节(16位)来存储一个三元组字符。这需要比每个字符(如果是ascii)初始1字节少1/3字节。要存储三组字符,请从字节中读取位(例如从左到右)
public byte getBit(byte b, int position)
{
return (b >> position) & 1;
}
***您可以使用post中的算法将位设置为字节,这些算法是:
设置位(将其设置为1)
b=b |(1)知道有限的字符a-z(26)可以在26字节中编码32个字符,而无需使用更高级的压缩算法。混合大小写的输出应该是什么?比如aaaabbbc==5A3B2C?@user1428716它应该是A3B3C2
b = b | (1 << position);
b = b & ~(1 << position);