"Coding Interview Guide" -- 判断字符数组中是否所有的字符都只出现过一次

题目

  给定一个字符类型数组chas[],判断chas中是否所有的字符都只出现过一次

  举例,chas=['a', 'b', 'c'],返回true; chas=['1', '2', '1'],返回false

 

要求

  时间复杂度为O(N)

 1 // 方法一,使用HashSet数据结构
 2 public boolean isUnique(char[] chas)
 3 {
 4     if(chas == null)
 5     {
 6       return true;
 7     }
 8 
 9     HashSet<Character> set = new HashSet<>();
10     for(int i = 0; i < chas.length; i++)
11     {
12       if(set.contains(chas[i]))
13       {
14           return false;
15       }
16       else
17       {
18           set.add(chas[i]);
19       }
20     }
21     return true;
22 }
23 
24 
25 // 方法二,使用一个布尔型数组
26 public boolean isUnique(char[] chas)
27 {
28     if(chas == null)
29     {
30       return true;
31     }
32         
33     boolean[] map = new boolean[256];
34     for(int i = 0; i < chas.length; i++)
35     {
36       if(map[chas[i]])
37       {
38           return false;
39       }
40       map[chas[i]] = true;
41     }
42     return true;
43 }

 

要求

  在保证额外空间复杂度为O(1)的前提下,实现时间复杂度尽量低的方法

 1 public boolean isUnique(char[] chas)
 2 {
 3     if(chas == null || chas.length < 2)
 4     {
 5       return true;
 6     }
 7 
 8     heapSort(chas);
 9     for(int i = 1; i < chas.length; i++)
10     {
11       if(chas[i] == chas[i - 1])
12       {    
13           return false;
14       }
15     }
16     return true;
17 }
18   
  // 堆排序的非递归实现 19 public void heapSort(char[] chas) 20 { 21 for(int i = 0; i < chas.length; i++) 22 { 23   heapInsert(chas, i); 24 } 25 for(int i = chas.length - 1; i > 0; i--) 26 { 27   swap(chas, 0, i); 28   heapify(chas, 0, i); 29 } 30 } 31 32 // 建立大根堆 33 public void heapInsert(char[] chas, int i) 34 { 35 int parent = 0; 36 while(i != 0) 37 { 38   parent = (i - 1) / 2; 39   if(chas[parent] < chas[i]) // 在大根堆中,任一子节点的值都比父节点的值小,根节点的值最大 40   { 41   swap(chas, parent, i); 42   i = parent; 43   } 44   else 45   { 46   break; 47   } 48 } 49 } 50 51 // 调整堆 52 public void heapify(char[] chas, int i, int size) 53 { 54 int left = i * 2 + 1; 55 int right = i * 2 + 2; 56 int largest = i; 57 while(left < size) 58 { 59   if(chas[left] > chas[i]) 60   { 61   largest = left; 62   } 63   if(right < size && chas[right] > chas[largest]) 64   { 65   largest = right; 66   } 67   if(largest != i) 68   { 69   swap(chas, largest, i); 70   } 71   else 72   { 73     break; 74   } 75   i = largest; 76   left = i * 2 + 1; 77    right = i * 2 + 2; 78 } 79 } 80 81 public void swap(char[] chas, int i, int j) 82 { 83 char temp = chas[i]; 84 chas[i] = chas[j]; 85 chas[j] = temp; 86 }

 

 

来源:左程云老师《程序员代码面试指南》

  

posted @ 2019-06-01 16:48  Latuper  阅读(345)  评论(0编辑  收藏  举报