java游程编码

时间:2012-07-11 22:01:53

标签: java run-length-encoding

我不知道如何开始我的任务。

我们必须制作一个运行长度编码程序,

例如,用户输入此字符串:

aaaaPPPrrrrr

替换为

4a3P5r

有人可以帮我开始吗?

6 个答案:

答案 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;
    }

}