簡體   English   中英

輸入 integer 和多行字符串時 java 中的 class 掃描儀的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM