【题目】
给定一个字符类型数组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 }
来源:左程云老师《程序员代码面试指南》