java中的游程编码
如何以“nxw”形式打印特定数字的数字以及数字本身。n是数字的频率,w是数字本身 例如,如果用户的输入是1。输出为3x1 如果用户的输入在第一行为1,在第二行为7 1 0。输出为3x1.2x7.2x1.1x0。没有空间 注:java中的游程编码,java,run-length-encoding,Java,Run Length Encoding,如何以“nxw”形式打印特定数字的数字以及数字本身。n是数字的频率,w是数字本身 例如,如果用户的输入是1。输出为3x1 如果用户的输入在第一行为1,在第二行为7 1 0。输出为3x1.2x7.2x1.1x0。没有空间 注: 循环以一个点结束 数字不必按特定顺序排列 用户可以输入任意数量的数字 例如,输入可以是第一行的11,第二行的7,11,10。。。等等 这是到目前为止我的代码。但我知道这不是真的 import java.util.*; public class LaufLaeng
- 循环以一个点结束
- 数字不必按特定顺序排列
- 用户可以输入任意数量的数字
import java.util.*;
public class LaufLaengenKodierung {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int freq = 0;
int oldNum = 0;
int num = 0;
boolean first = true;
while(sc.hasNextInt()) {
int i = sc.nextInt();
if(i == oldNum) {
freq++;
num = i;
} else if(i != oldNum) {
freq = 1;
oldNum = i;
num = i;
if(first) {
first = false;
num = i;
freq = 1;
}
}
}
System.out.print(freq + "x" + num + ".");
sc.close();
}
}
您必须保存每个数字的计数。您可以通过为
0
到9
的数字创建一个大小为10的int
数组来实现这一点。然后是一个简单的循环,就像
while(sc.hasNextInt()) {
int i = sc.nextInt();
countArray[i]++;
}
然后检查数组中的每个元素,并在大于0时输出数字的计数。它可以是这样的:
for (int i=0; i<countArray.length; i++) {
if (countArray[i] > 0) {
System.out.printf("%dx%d.", countArray[i], i);
}
}
for(int i=0;i 0){
System.out.printf(“%dx%d.”,countArray[i],i);
}
}
请记住,您必须检查用户输入的数字是否在0到9的范围内,否则会遇到
ArrayIndexOutOfBoundsException
s。现有代码需要稍微重构,以便在相同值的子序列结束后立即打印频率和整数值
static void printRLE(字符串输入){
扫描仪sc=新扫描仪(输入);
intfreq=0;
int-oldNum=0;
布尔值优先=真;
while(sc.hasnetint()){
int i=sc.nextInt();
如果(i!=oldNum | | first){
如果(第一)
第一个=假;
else//整数值已更改
System.out.printf(“%dx%d.”,freq,oldNum);
oldNum=i;
频率=1;
}否则{
freq++;
}
}
如果(!第一个)
System.out.printf(“%dx%d.%n”,频率,oldNum);
其他的
System.out.println(“未找到整数”);//如果正确,则打印0x0
sc.close();
}
测试:
String[]测试={
"",
“abc。”,
"11 11 11",
“11\n7 1 0”,
"0 0 0",
};
用于(字符串测试:测试){
System.out.println(“test=[“+test+”]);
printRLE(测试);
系统输出打印项次(“----------”);
}
输出:
test=[]
No integer found
--------
test=[abc.]
No integer found
--------
test=[11 11 11]
3x11.
--------
test=[1 1 1
7 7 1 1 0]
3x1.2x7.2x1.1x0.
--------
test=[0 0 0]
3x0.
--------
更新 如果只需要对单独的数字进行计数(而不是整数),例如输入的
11
应转换为6x1.
而不是如上所示的3x11.
,则应重构该方法以处理数字中的数字:
静态无效数字(字符串输入){
扫描仪sc=新扫描仪(输入);
intfreq=0;
int-oldNum=0;
布尔值优先=真;
out:while(sc.hasNext()){
字符串s=sc.next();//获取用空格分隔的“number”
for(char c:s.toCharArray()){
如果(!Character.isDigit(c)){
爆发
}
int i=c-‘0’;
如果(i!=oldNum | | first){
如果(第一)
第一个=假;
else//数字已更改
System.out.printf(“%dx%d.”,freq,oldNum);
oldNum=i;
频率=1;
}否则{
freq++;
}
}
}
如果(!第一个)
System.out.printf(“%dx%d.%n”,频率,oldNum);
其他的
System.out.println(“未找到整数”);
sc.close();
}
测试输出:“11 11”、“112 223”、“11 11\n7 1 0”、“0 0 0”
:
当前代码具体有什么问题?你能举一个失败的例子,包括输入、预期输出和实际输出吗?你如何知道用户何时完成输入整数?数字是按排序顺序输入的,还是按任意随机顺序输入的?@Brian McCutchon,如果输入为0。。输出为3x0。这是正确的。但是如果输入0 1。。输出为1x1。如果第一行的输入为0,第二行的输入为2,则输出为3x2。当它应该是0x3.3x2.@ @ Gilbert Le Blanc在用户进入“”时,或任何其他的整数时,代码都有bug。如果第一行的输入为1,第二行的输入为7 7 2 1,则输出为3x1.2x7.2x2。这是不正确的,因为它不包括最后一个数字,即1。那么,最后,应该是1x1。你准备好打赌了吗?在其他测试中,打印两种方法的
“1 1 \n7 2 2 1”的结果,如测试=[1 1 1 7 2 1]数字:3x1.2x7.2x2.1x1。数字:3x1.2x7.2x2.1x1。
test=[11 11 11]
6x1.
--------
test=[112 223]
2x1.3x2.1x3.
--------
test=[1 1 1
7 7 1 1 0]
3x1.2x7.2x1.1x0.
--------
test=[0 0 0]
3x0.
--------