すべての文字が文字配列を決定するために、一度だけ表示するかどうか - 「コーディング面接ガイド」

[ タイトル ]

  文字型の配列を考えるとチャス[]、チャズは、すべての文字は一度だけ表示されるかどうかを決定します

  例えば、チャズは= [ 'A'、 'B'、 'C​​']、trueを返す;のChas = [ '1'、 '2'、 '1']、それがfalseを返します

 

[ 条件 ]

  時間計算量はO(N)

1  // データ構造HashSetの使用方法
2  公共 ブール isUnique(CHAR []のChas)を
 3  {
 4      IF(チャズ== NULL 5      {
 6        リターン trueに;
 7      }
 8。 
9。      HashSetの<文字> SET = 新しい新しい HashSetの<> ();
 10      INT I = 0;私はchas.lengthを<; I ++が。11      {
 12は       IF ((チャズ[I])set.contains)
 13は       、{
 14            リターン falseに;
 15        }
 16        
17。       {
 18れる           (チャズ[I])set.add;
 19        }
 20      }
 21が     戻り trueに22である }
 23である 
24  
25  // 第二の方法、ブール配列使用
26がある 公共 ブール isUnique(CHAR []のChas )
 27  {
 28      IF(のChasは== NULL 29      {
 30        リターン trueに31である     }
 32          
33である     ブール[]地図= 新しい ブール [256 ]。
34      のためにint型 ; iがchas.lengthを<I ++は、I = 0 35      {
 36        であれば(マップ[チャス[I])
 37        {
 38            リターン 39        }
 40        マップ[チャス[I] = 41      }
 42      リターン 43 }

 

[ 条件 ]

  余分なスペースの複雑さを確保する上でO(1)の方法を達成するために、可能な限り低い時間計算を提供されています

1  公共 ブール isUnique(CHAR []のChas)
 2  {
 3      であれば(チャズ== NULL || chas.length <2 4      {
 5        リターン 6      }
 7  
8      ヒープソート(チャズ)。
9      のためには、int型 i = 1; iがchas.lengthを<; Iは++ 10      {
 11の       場合(チャズ[I] ==のChas [I - 1 ])
 12        {    
 13            リターン 14        }
 15     }
 16      リターン 17  }
 18   
  //堆排序的非递归实现 19 公共 ボイドヒープソート(CHAR []のChas) 20 { 21 のためのint型 i = 0; iがchas.lengthを<; Iは++ 22 { 23   heapInsert(チャス、I)。 24 } 25 のためにINT I = chas.length - 1、I> 0; i-- 26 { 27   スワップ(チャス、0 、I)。 28   heapify(チャス、0 、I)。 29 } 30 } 31で 32 // 大ルートスタックビルド 33である 公共 ボイド heapInsert(CHAR []のChasは、int型I)が 34である { 35 のint = 0親; 36 ながら(I = 0] 37 { 38である   親=(I - 1)/ 2 ; 39   IF(チャズ[親] <チャス[I]) // 親ノードの任意のサブノードの値が小さい場合よりも大きなヒープルートは、ルートノードの最大値は 40   { 41は   、スワップ(チャズ、親I); 42である   I = 親; 43れます   } 44   他の 45   { 46   ブレーク47   } 48 } 49 } 50 51 // 调整堆 52 公共 ボイド heapify(CHAR []のChasは、int型 I、int型のサイズ) 53 { 54 のint左= iは* 2 + 1 55 int型の右=私は2 + 2 * ; 56 int型 =最大I; 57 一方(左< サイズ) 58 { 59   もし(チャス[左]> のChas [I]) 60   { 61   、最大= 左。 62   } 63   であれば(右<サイズ&&のChas [右]> のChas [最大]) 64   { 65   、最大= 右。 66   } 67   であれば(最大=!I) 68   { 69   スワップ(チャス、最大、I)。 70   } 71   他の 72   { 73     ブレーク74   } 75   、I = 最大。 76   左= I 2 + 1 * 77    右= I 2 + 2 * 78 } 79 } 80 81 公共 ボイドスワップ(CHAR []のChas、int型 I、INT J) 82 { 83 チャー TEMP = チャズ[I]を、 84件 のChas [I] =用のChas [J]。 85件 のChas [J] = TEMP。 86 }

 

 

出典:左チェンユン先生「プログラマーコードインタビューガイド」

  

おすすめ

転載: www.cnblogs.com/latup/p/10960136.html