判断字符数组中是否所有的字符只出现了一次(左程云)非递归堆排序实现
来源:互联网 发布:奥米姿淘宝 编辑:程序博客网 时间:2024/06/04 22:46
【题目】
给定一个字符类型数组chas,判断chas中是否所有的字符都只出现过一次。
【基本思路】
一.时间复杂度为O(N)的算法。
使用哈希表,记录每个字符出现的频数,如果发现字符的频数不为1,直接返回False。
二.时间复杂度为O(NlogN),空间复杂度为O(1)的算法。
1.先将数组排序,再判断当前字符是否等于前一个字符即可。
2.关键使用什么样的排序算法,满足复杂度要求的算法只有非递归版的堆排序。
C++版本:
#include<iostream>#include<string>using namespace std;//以插入的形式构建堆void heapInsert(string& s,int i){ int parent=0; while(i) { parent=(i-1)/2;//找到父节点 if(s[parent]>=s[i]) break; swap(s[parent],s[i]); i=parent; } return ;}//堆排序,将堆顶与最后一个元素互换后调整堆的调整函数void heapify(string &s,int i,int length){ //调整堆 int left=i*2; int right=i*2+1; int largest=i; while(left<length) { if(s[left]>s[i]) largest=left; if(right<length&&s[right]>s[largest]) largest=right; if(largest==i) break; else swap(s[largest],s[i]); left=largest*2; right=largest*2+1; }}void heapsort(string& s){ for(int i=0;i<s.size();i++) { heapInsert(s,i); } for(int i=s.size()-1;i>0;i--) { swap(s[0],s[i]);//将堆顶与最后一个元素互换 heapify(s,0,i); } return ;}bool isUnique(string& s){ int n=s.size(); if(n==0) return false; heapsort(s); for(int i=1;i<s.size();i++) { if(s[i]==s[i-1]) return false; } return true;}int main(){ string s; while(cin>>s;){ cout<<(isUnique(s)?"Yes":"No")<<endl; } system("pause"); return 0;}
阅读全文
0 0
- 判断字符数组中是否所有的字符只出现了一次(左程云)非递归堆排序实现
- 字符串问题---判断字符数组中是否所有的字符只出现了一次
- 判断字符数组中是否所有的字符都只出现过一次 Python 版
- 判断字符数组中是否所有的字符都出现一次
- 字符串之字符数组种是否所有的字符都只出现过一次
- 数组中只出现一次的字符
- 判断字符串的字符是否只出现一次
- 判断串中每种字符是否只出现一次,时间复杂度O(N)
- 找出数组中第一个只出现一次的字符
- 剑指offer 40---数组中只出现一次的字符
- 判断字符是否出现一次
- 第一个只出现一次的字符(Java实现)
- 只出现一次的字符
- 在一个字符串中找到第一个只出现一次的字符(java实现)
- 在一个字符串中找到第一个只出现一次的字符(java实现)
- 在一个字符串中找到第一个只出现一次的字符(JAVA实现)
- 华为OJ ---找出字符串中第一个只出现一次的字符(java实现)
- 请实现一个函数用来找出字符流中第一个只出现一次的字符
- java八种基本数据类型
- 剑指offer(29)—最小的K个数
- 关于Edittext首位为0多种情况考虑
- WEB 输入校验正则表达式
- requests库入门-11-自定义请求
- 判断字符数组中是否所有的字符只出现了一次(左程云)非递归堆排序实现
- UGUI 学习笔记 2 静态字体
- poj 3616 Milking Time
- 软件测试——测试流程重要性
- LeetCode(38)--Count and Say
- hibernate_事务处理、session管理
- C# 后台分页
- 两分钟理解Android中PX、DP、SP的区别
- class类命名