0

私は最近、いくつかの技術面接に直面しました。質問は次のとおりです。

Q.1 「Hello」と「World」の 2 つの文字列が指定されています。2 番目の文字列ではなく 1 番目の文字列に存在する一意の文字を出力します

出力: He.

私の答え: 1つの文字列の各文字を2番目の他のすべての文字と比較しますが、まったく最適ではありません(間違い、明らかに)。

Q.2 ABCABBABCAB, OUTPUT:4A5B2C` (基本的に各文字の出現回数をカウントする)
は、文字列内の複数のトラバーサルではなく、1 つのパスでこれを行います。

同様に、他の質問もほとんどありません..

私の核心に生じる質問は次のとおりです。

  • コレクション フレームワークのどのデータ構造が、そのようなシナリオを最適な方法で処理するのに役立つか。と

  • Java Collection Framework のどの特定のデータ構造をいつ、なぜ使用するのか?

また、そのような話題の本があれば教えてください

ヘルプブック、リファレンス、リンクは、学習と理解に大いに役立ちます。

重要: データ構造が実装されているリアルタイムのシナリオが必要です

私はコレクション API を徹底的にではなく、階層と主要なデータ構造クラスの要約されたアイデアを研究しました。私はそれらを使用する方法を知っていますが、正確にどこで、なぜそれらを使用するのかはわかりません。

4

5 に答える 5

2
public class G {
public static void main(String[] args) {
    new G().printCharacterCount("ABCABBABCAB");
    System.out.println();
    new G().printUniqueCharacters("Hello", "world");
}

void printUniqueCharacters(String a, String b) {
    Set<Character> set = new HashSet<Character>();
    for (int i = 0; i < a.length(); i++)
        set.add(a.charAt(i));

    for (int i = 0; i < b.length(); i++)
        set.remove(b.charAt(i));

    for (Character c : set)
        System.out.print(c);
}

void printCharacterCount(String a) {
    Map<Character, Integer> map = new TreeMap<Character, Integer>();

    for(int i = 0; i < a.length(); i++) {
        char c = a.charAt(i);
        if(!map.containsKey(c))
            map.put(c, 0);

        map.put(c, map.get(c) +1);
    }

    for(char c : map.keySet()) {
        System.out.print(map.get(c) + "" + c);
    }
}
}
于 2012-10-23T14:19:31.293 に答える
1

使用できるアルゴリズムの例。

Q1.

  • String1 のすべての文字をセットに入れます (一意のエントリのみを保持します)
  • セットから String2 のすべての文字を削除します
  • あなたのセットには、String2 にはなかった String1 の一意の文字が含まれるようになりました

Q2.

  • 文字の出現回数をMap<Character, Integer>
  • 文字がマップにない場合、カウントは 1 です
  • 文字がすでにマップにある場合、カウントをインクリメントする必要があります

私はそれらの使い方を知っていますが、どこで、なぜそれらを正確に使用するのか分かりません。

その種のパズルを自分で解こうとすることによって;-)

于 2012-10-23T14:20:36.127 に答える
1
Set<Character> set1=new HashSet<Character>(Arrays.asList(ArrayUtils.toObject("Hello".toCharArray())));
Set<Character> set2=new HashSet<Character>(Arrays.asList(ArrayUtils.toObject("World".toCharArray())));
set1.removeAll(set2);
System.out.println(set1);

apache ArrayUtils.toObject(char[] array)を使用します。代わりに util メソッドを記述できます。

于 2012-10-23T14:24:26.033 に答える
0
public static void main(String[] args) {
    String s1 = "Hello";
    String s2 = "World";

    List<Character> list1 = new ArrayList<Character>();
    List<Character> list2 = new ArrayList<Character>();
    for(char c : s1.toCharArray()){
        if(!list1.contains(c)){
            list1.add(c);
        }
    }
    for(char c : s2.toCharArray()){
        if(!list2.contains(c)){
            list2.add(c);
        }
    }
    List<Character> uniqueList = new ArrayList<Character>();
    for (Character character1 : list1) {
        boolean unique = true;
        for (Character character2 : list2) {
            if(character1.equals(character2)){
                unique = false;
            }
        }
        if(unique){
            uniqueList.add(character1);
        }
    }
    for (Character character : uniqueList) {
        System.out.print(character);
    }
}
于 2014-11-05T11:03:59.780 に答える
0

#1の場合:

    String one = "Hello";
    String two = "World";
    Set<Character> set = new HashSet<Character>();

    for (int i = 0; i < one.length(); i++) {
        set.add(one.charAt(i));
    }

    for (int i = 0; i < two.length(); i++) {
        set.remove(two.charAt(i));
    }

    for (char ch : set) {
        System.out.println(ch);
    }

#2の場合:

    String str = YourInput;
    int[] array = new int[26];
    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);
        array[ch - 'A']++;
    }
    for (int i = 0; i < array.length; i++) {
        if (array[i] != 0) {
            System.out.println(array[i] + (char) (i + 'A'));
        }
    }
于 2013-04-19T13:11:57.953 に答える