java游程编码
我不知道如何开始我的任务。
我们制作了一个游程编码程序,
例如,用户输入此字符串:
aaaaPPPrrrrr
被替换为
4a3P5r
有人可以帮我开始吗?
希望这会让你开始你的任务:
行程编码背后的基本思想是像aaaa这样的连续出现的标记可以用更短的forms4a(意思是“以下四个字符是’a’”)代替。 这种类型的编码在计算机图形学的早期使用,以在存储图像时节省空间。 那时候,video卡支持少量颜色和图像,通常在图像的重要部分连续使用相同的颜色)
您可以在维基百科上详细阅读
http://en.wikipedia.org/wiki/Run-length_encoding
为了对字符串进行行程编码,您可以遍历输入字符串中的字符。 有一个计数器,计算你连续看到相同字符的次数。 当您看到另一个字符时,输出计数器的值,然后输出您一直在计算的字符。 如果计数器的值为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; }
试一试。
这可以使用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)。 这里使用几个辅助变量来跟踪我们在迭代“索引”中的位置,另一个用于记录我们看到的特定字母“计数”的数量,我们保留了构建编码字符串的所有必要信息,因为我们走。
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
我试过这个。 它肯定会起作用。
例如,如果输入字符串是“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; } }