我不知道如何开始我的任务。
我们必须制作一个运行长度编码程序,
例如,用户输入此字符串:
aaaaPPPrrrrr
替换为
4a3P5r
有人可以帮我开始吗?
答案 0 :(得分:6)
希望这会让你开始完成作业:
行程编码背后的基本思想是,像aaaa这样的连续出现的标记可以用较短的形式4a(意思是“以下四个字符是'a'”)代替。这种类型的编码在计算机图形学的早期使用,以在存储图像时节省空间。那时候,视频卡支持少量颜色和图像,对于图像的重要部分,它们通常具有相同的颜色。
您可以在维基百科上详细阅读
http://en.wikipedia.org/wiki/Run-length_encoding
为了对字符串进行行程编码,您可以遍历输入字符串中的字符。有一个计数器,计算你连续看到相同字符的次数。当您看到另一个字符时,输出计数器的值,然后输出您一直在计算的字符。如果计数器的值为1(意味着您只看到一行中的一个字符),则跳过输出计数器。
答案 1 :(得分:1)
public String runLengthEncoding(String text) {
String encodedString = "";
for (int i = 0, count = 1; i < text.length(); i++) {
if (i + 1 < text.length() && text.charAt(i) == text.charAt(i + 1))
count++;
else {
encodedString = encodedString.concat(Integer.toString(count))
.concat(Character.toString(text.charAt(i)));
count = 1;
}
}
return encodedString;
}
试一试。
答案 2 :(得分:1)
这可以使用StringBuilder和一些辅助变量轻松简单地完成,以跟踪您看到的每个字母的数量。然后就像你去的那样建立。
例如:
static String encode(String s) {
StringBuilder sb = new StringBuilder();
char[] word = s.toCharArray();
char current = word[0]; // We initialize to compare vs. first letter
// our helper variables
int index = 0; // tracks how far along we are
int count = 0; // how many of the same letter we've seen
for (char c : word) {
if (c == current) {
count++;
index++;
if (index == word.length)
sb.append(current + Integer.toString(count));
}
else {
sb.append(current + Integer.toString(count));
count = 1;
current = c;
index++;
}
}
return sb.toString();
}
由于这显然是家庭作业,我挑战你学习这种方法,而不仅仅是简单地使用答案作为你的家庭作业的解决方案。 StringBuilders对于构建事物非常有用,因此在许多情况下保持运行时O(n)。这里使用几个辅助变量来跟踪我们在迭代“index”中的位置,另一个用于记录我们看到的特定字母“count”的数量,我们保留了构建编码字符串的所有必要信息,因为我们去。
答案 3 :(得分:0)
试试这个:
private static String encode(String sampleInput) {
String encodedString = null;
//get the input to a character array.
// String sampleInput = "aabbcccd";
char[] charArr = sampleInput.toCharArray();
char prev=(char)0;
int counter =1;
//compare each element with its next element and
//if same increment the counter
StringBuilder sb = new StringBuilder();
for (int i = 0; i < charArr.length; i++) {
if(i+1 < charArr.length && charArr[i] == charArr[i+1]){
counter ++;
}else {
//System.out.print(counter + Character.toString(charArr[i]));
sb.append(counter + Character.toString(charArr[i]));
counter = 1;
}
}
return sb.toString();
}
答案 4 :(得分:-1)
import java.util.Scanner;
/**
* @author jyotiv
*
*/
public class RunLengthEncoding {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Enter line to encode:");
Scanner s=new Scanner(System.in);
String input=s.nextLine();
int len = input.length();
int i = 0;
int noOfOccurencesForEachChar = 0;
char storeChar = input.charAt(0);
String outputString = "";
for(;i<len;i++)
{
if(i+1<len)
{
if(input.charAt(i) == input.charAt(i+1))
{
noOfOccurencesForEachChar++;
}
else
{
outputString = outputString +
Integer.toHexString(noOfOccurencesForEachChar+1) + storeChar;
noOfOccurencesForEachChar = 0;
storeChar = input.charAt(i+1);
}
}
else
{
outputString = outputString +
Integer.toHexString(noOfOccurencesForEachChar+1) + storeChar;
}
}
System.out.println("Encoded line is: " + outputString);
}
}
我试过这个。它肯定会起作用。
答案 5 :(得分:-1)
例如,如果输入字符串是“wwwwaaadexxxxxx”, 那么函数应该返回“w4a3d1e1x6”。
源代码(Java): -
package com.algo.runlengthencoding;
public class RunlengthEncoding
{
// For example, if the input string is “wwwwaaadexxxxxx”,
// then the function should return “w4a3d1e1x6”.
public static void main(String args[]) {
String str = "aaaabbbccdddddddeeffffff";
String value = getRunLengthEncodingForGivenString(str);
System.out.println(value);
}
public static String getRunLengthEncodingForGivenString(String str) {
String value = "", compare = "";
for (int i = 0; i < str.length(); i++) {
CharSequence seq = str.charAt(i) + "";
if (compare.contains(seq))
continue;
compare = compare + str.charAt(i);
int count = 0;
for (int j = 0; j < str.length(); j++) {
if (str.charAt(i) == str.charAt(j))
count = count + 1;
}
value = value + str.charAt(i) + Integer.toString(count);
}
return value;
}
}