zoukankan      html  css  js  c++  java
  • "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 }

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

      

  • 相关阅读:
    oracle 数据库关闭的的几种方式总结
    oracle热备份
    oracle 的 startup,startup mount,startup nomount之间的区别
    Oracle数据导入导出imp/exp命令总结
    oracle模糊查询效率可这样提高
    流程控制
    常量
    java序列化
    JVM锁说明
    go变量和数据类型
  • 原文地址:https://www.cnblogs.com/OoycyoO/p/10960136.html
Copyright © 2011-2022 走看看