题目:
思路:第一种是直接用一个数组组成 的map来统计出现的个数。
第二种的思想是先对数组中的元素进行排序,这样相同的元素就会放在一起。重点是使用什么样的排序。对于时间复杂度是o(nlogn)的算法,归并排序需要额外的辅助数组,快速排序额外空间不能达到o(1);希尔排序的时间复杂度不固定,因此选择堆排序。但是一般堆排序是使用递归函数实现的,需要额外的栈空间,下面是左神书中使用的非递归的写法。
代码:
实现1:
public class hd{ public static void main(String []args){ Scanner sc=new Scanner(System.in); String a=sc.next(); char[]a1=a.toCharArray(); System.out.println(method(a1)); } public static boolean method (char[]a1){ boolean []map=new boolean[256]; for(int i=0;i<a1.length;i++){ if(map[a1[i]]){ return false; } else{ map[a1[i]]=true; } } return true; } }
实现2:
public class hd{ public static void main(String []args){ Scanner sc=new Scanner(System.in); String a=sc.next(); char[]a1=a.toCharArray(); System.out.println(method(a1)); } public static boolean method (char[]a1){ if(a1==null) return true; heapsort(a1); //如果相连的相同,表示存在重复字符 for(int i=1;i<a1.length;i++){ if(a1[i-1]==a1[i]){ return false; } } return true; } public static void heapsort(char[]a1){ for(int i=0;i<a1.length;i++){ heapInsert(a1,i); } for(int i=a1.length-1;i>0;i--){ //将找到的最大元素放在数组的最后 swap(a1,0,i); //重新调整堆 heapify(a1,0,i); } } //将元素都插入到堆中,构建最大堆的过程 public static void heapInsert(char[]a1,int i){ int parent=0; while(i!=0){ parent=(i-1)/2; if(a1[parent]<a1[i]){ swap(a1,parent,i); i=parent; }else{ break; } } } //重新调整堆 public static void heapify(char[]a1,int i,int size){ int left=i*2+1; int right=i*2+2; int largest=i; while(left<size){ if(a1[left]>a1[right]){ largest=left; } if(right<size&&a1[right]>a1[largest]){ largest=right; } if(largest!=i){ swap(a1,largest,i); }else{ break; } i=largest; left=i*2+1; right=i*2+2; } } public static void swap(char[]a1,int index1,int index2){ char temp=a1[index1]; a1[index1]=a1[index2]; a1[index2]=temp; } }