2017-06-21 1 views
-1
Key   value 
1-5   A 
7-10   B 
11-15   C 

入力が4の場合、出力A、入力8、出力Bなどです。 次のデータを格納するために使用できるデータ構造は、値を複数回保存しないでください。どのデータ構造がキーと値のペアに対して効率的ですか?

私はHashMapを言ったが、それは効率的ではない。

P.S.私はインタビューで尋ねられました。

+0

それが許可されます場合は、キーと値を交換して、キーとしてA、B、Cを使用して、値aを格納することができますハッシュマップにオブジェクトをリスト/設定します。値は1-5,7-10,11-15です。これは効率的ではありませんが、ここの目的に役立つかもしれません。 – srp321

+0

私はOPの出所を知っています。面接者は実際には時々意味があり、自分の質問や反駁に説明を与えることはめったにありません。 –

+0

BSTここで、最小数に基づいてインデックスを作成し、各ノードに対して最大値と値を保存します。探している数値以下の最小値を検索し、最大値が自分の数値以上かどうかを確認します。 – dave

答えて

5

使用TreeMapです。次に、任意のキーのfloorKey()ceilingKey()のデータを検索し、両方の値が同じ場合はそれを返します。それ以外の場合はnullを返します。ここでの各クエリは、回答するのにO(log n)の時間が必要ですが、空間の複雑さは他のアプローチに比べて非常に少なくなります。ここでは、値がそれぞれintervalで一意であり、各キーに関連付けられている値が1つしかないと考えました。

TreeMap<Integer,String> map = new TreeMap<Integer,String>(); 

map.put(1,"A"); map.put(5,"A"); 
map.put(7,"B"); map.put(10,"B"); 
map.put(11,"C"); map.put(15,"C"); 

System.out.println(getData(4)); 
System.out.println(getData(6)); 

static String getData(int key) 
{ 
    Integer ceiling_key= map.ceilingKey(key); 
    Integer floor_key = map.floorKey(key); 

    if(ceiling_key == null || floor_key == null) 
     return null; 

    String value1 = map.get(ceiling_key); 
    String value2 = map.get(floor_key); 

    if(value1.equals(value2)) 
     return value1; 
    else 
     return null; 

} 

出力:

A 
null 
+1

完璧、ありがとう@sanket –

1

私はインタビュアーがあなたの場合は値

を持ついくつかのキーを保持することができますConcurrentNavigableMap

の答えを探していたと思う:

public static NavigableMap<Integer, String> map = new TreeMap<Integer, String>(); 
    static { 
     map.put(1, "A"); // 1..5 => A 
     map.put(6, null); // 6 => empty 
     map.put(7, "B"); // 7..10 => N 
     map.put(11, "C"); // 11..15 => C 
     map.put(16, null); // 16.. => empty 
    } 

をしてから

map.floorEntry(4).getValue() 
で値を取得します
+1

Interstingの実装ですが、 'NavigableMap.floorEntry'を使用して、' Map.get'ではなく 'range'として値を取得する必要があることに注意してください。ちょっと掘り下げてみると、これは 'TreeMap'によって実装された' NavigableMap'の機能です。特定のクラスを使う必要はありません。 – AxelH

+0

更新されたソリューション。面接の質問は、キーの範囲について質問しているようです – user7294900

+0

@ user7294900いいです。ありがとう –

0

キーが繰り返されないので、index of arrayを次のように使用できます。キー:

int[] array = {0,A,A,A,A,A,0,B,B,B,B,C,C,C,C,C,}; 

array[1] - array[5]での値Aarray[7] - array[10] 値であり、キーが区間の終点であることで値を格納するためにB

+0

これを使用することはできません、値を格納する複数の時刻が許可されていません。 –

関連する問題