落書きノート

ふと自分が気になった事を書いてます

Javaで問題を再度解く 書き換え

過去に作ったプログラムが、今の自分になぜかわかりにくくなってきたので、改良も兼ねて、再度プログラムを作ってみたんですけど、余計わかりにくくなってるかも…と思いましたが、まあ気にしない。Stringクラスの使い方、よーくわかったような気がします。今日はここまでかな。

世界で闘うプログラミング力を鍛える本 ~コーディング面接189問とその解法~

世界で闘うプログラミング力を鍛える本 ~コーディング面接189問とその解法~

// 問題1.1

import java.util.Scanner;
import java.util.Hashtable;

class q1_1_another {
    public static void main(String[] args) {
        Hashtable<Character, Boolean> numbers =
            new Hashtable<Character, Boolean>();
        Scanner scan = new Scanner(System.in);
        String input = scan.nextLine();
        for(int i = 0; i < input.length(); i++)
            numbers.put(input.charAt(i), false);
        boolean flag = true;
        for(int i = 0; i < input.length(); i++) {
            if(numbers.get(input.charAt(i))) {
                flag = false;
                break;
            }
            if(numbers.containsKey(input.charAt(i)))
                numbers.put(input.charAt(i), true);
        }
        if(flag)
            System.out.println("固有の文字列です。");
        else
            System.out.println("固有の文字列ではありません。");
    }
}

// 問題1.1 別解

import java.util.Scanner;

class q1_1_another2 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String input = scan.nextLine();
        String sentence = "";
        boolean flag = true;
        Outer:
        for(int i = 0; i < input.length(); i++) {
            sentence = sentence + input.charAt(i);
            for(int j = 0; j < sentence.length() - 1; j++) {
                if(input.charAt(i) == sentence.charAt(j)) {
                    flag = false;
                    break Outer;
                }
            }
        }
        if(flag)
            System.out.println("固有の文字列です。");
        else
            System.out.println("固有の文字列ではありません。");
    }
}

// 問題1.2

import java.util.Scanner;
import java.util.Hashtable;
import java.util.Enumeration;

class q1_2_another {
    public static void main(String[] args) {
        Hashtable<Character, Integer> numbers =
            new Hashtable<Character, Integer>();
        Scanner scan = new Scanner(System.in);
        boolean flag = true;
        String input = scan.nextLine();
        String input2 = scan.nextLine();
        for(int i = 0; i < input.length(); i++) {
            if(numbers.containsKey(input.charAt(i)))
                numbers.put(input.charAt(i), numbers.get(input.charAt(i)) + 1);
            else
                numbers.put(input.charAt(i), 1);
        }
        for(int i = 0; i < input2.length(); i++) {
            if(numbers.containsKey(input2.charAt(i))
               && numbers.get(input2.charAt(i)) > 0)
                numbers.put(input2.charAt(i), numbers.get(input2.charAt(i)) - 1);
            else {
                flag = false;
                break;
            }
        }
        Enumeration<Integer> e = numbers.elements();
        while(e.hasMoreElements())
            if(e.nextElement() > 0) {
                flag = false;
                break;
            }
        if(flag)
            System.out.println("この二つの文字列は並び替えになっています。");
        else
            System.out.println("この二つの文字列は並び替えになっていません。");
    }
}

追記

もう少し楽にコーディングする術もありそうですね。一時変数を使った方が可読性が増しそうです。