[英]problem of the class Scanner in java when Input an integer and multiline string
我在解決 java 中的算法問題時遇到了問題。 算法如下:
問題描述:
給定 n 個十六進制正整數,output 它們的八進制數
輸入格式:
輸入的第一個動作是正數 integer n (1<= n <=10) 接下來n行,每行由0~9個大寫字母A~F組成的字符串,代表要轉換的十六進制正整數, 每個十六進制數的長度不超過 100,000
output 格式
Output n 行,每行輸入對應的八進制正 integer。
【 筆記 】
您輸入的十六進制數沒有前導 0,例如 012A。 output 八進制數不能有前導 0
樣本輸入:
2
39
123ABC
樣品 output:
71
4435274
我的解決方案如下:
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
String[] hexMapping = {
"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"
};
Map<String,String> octMapping = new HashMap<>();
octMapping.put("000","0");
octMapping.put("001","1");
octMapping.put("010","2");
octMapping.put("011","3");
octMapping.put("100","4");
octMapping.put("101","5");
octMapping.put("110","6");
octMapping.put("111","7");
String hexString = "";
StringBuilder hex2Bin = new StringBuilder("");
StringBuilder bin2Oct = new StringBuilder("");
Scanner input = new Scanner(System.in);
int n = input.nextInt();
// consuming the <enter> from input above
input.nextLine();
for (int i = 0; i < n; i++) {
hexString = input.nextLine();
// hex to bin
int hexLen = hexString.length();
for (int j = 0; j < hexLen; j++) {
if (hexString.charAt(j)>'9') {
hex2Bin.append(hexMapping[hexString.charAt(j)-'A'+10]);
} else {
hex2Bin.append(hexMapping[hexString.charAt(j)-'0']);
}
} //end for
// add "00" or "0"
int len = hex2Bin.length();
if (len % 3 == 1) {
hex2Bin.insert(0,"00");
} else if (len % 3 == 2) {
hex2Bin.insert(0,"0");
}
// bin to oct
int newLen = hex2Bin.length();
String temp = "";
for (int j = 0; j < newLen; j+=3 ) {
temp = octMapping.get(hex2Bin.substring(j,j+3));
if (temp.equals("0")) {
continue;
}
bin2Oct.append(temp);
} //end for
System.out.println(bin2Oct);
}//end for
input.close();
}
當我輸入:
1
39
或者
1
123ABC
兩者都是正確的。
但是當我輸入:
2
39
123ABC
我無法得到正確答案。
我認為原因是我在 for 循環中使用 Scanner 時的輸入,我不知道如何解決這個問題,你能告訴我嗎?
您在循環結束時打印bin2Oct
的內容,但該變量在所有迭代中都被重用。
您需要在循環中聲明這些變量,以便每次都重新創建它們。 換句話說,移動以下塊:
StringBuilder hex2Bin = new StringBuilder("");
StringBuilder bin2Oct = new StringBuilder("");
到您的循環(在for (...)
行之后)。
您只需在 for 循環中的每個測試用例上初始化兩個StringBuilder
,在第一次嘗試時它將始終有效,因為它是空的,但在以后的嘗試中您繼續使用舊值,這會給您錯誤的答案.
另一句話但不影響最終答案,如果您使用掃描儀,您可以使用input.next()
讀取字符串值,這樣您就不需要使用nextLine
如果您使用nextInt()
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
String[] hexMapping = {
"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"
};
Map<String,String> octMapping = new HashMap<>();
octMapping.put("000","0");
octMapping.put("001","1");
octMapping.put("010","2");
octMapping.put("011","3");
octMapping.put("100","4");
octMapping.put("101","5");
octMapping.put("110","6");
octMapping.put("111","7");
String hexString = "";
Scanner input = new Scanner(System.in);
int n = input.nextInt();
for (int i = 0; i < n; i++) {
hexString = input.next();
// hex to bin
int hexLen = hexString.length();
StringBuilder hex2Bin = new StringBuilder("");
StringBuilder bin2Oct = new StringBuilder("");
for (int j = 0; j < hexLen; j++) {
if (hexString.charAt(j)>'9') {
hex2Bin.append(hexMapping[hexString.charAt(j)-'A'+10]);
} else {
hex2Bin.append(hexMapping[hexString.charAt(j)-'0']);
}
} //end for
// add "00" or "0"
int len = hex2Bin.length();
if (len % 3 == 1) {
hex2Bin.insert(0,"00");
} else if (len % 3 == 2) {
hex2Bin.insert(0,"0");
}
// bin to oct
int newLen = hex2Bin.length();
String temp = "";
for (int j = 0; j < newLen; j+=3 ) {
temp = octMapping.get(hex2Bin.substring(j,j+3));
if (temp.equals("0")) {
continue;
}
bin2Oct.append(temp);
} //end for
System.out.println(bin2Oct);
}//end for
input.close();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.