每天一个算法之寻找第一个只出现一次的数

散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key 对应一个存储位置f (key)。查找时,根据这个确定的对应关系找到给定值key 的映射f (key) ,若查找集合中存在这个记录,则必定在f (key) 的位置上。这里我们把这种对应关系称为散列函数, 又称为哈希(Hash) 函数。按这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table) 那么关键字对应的记录存储位置我们称为散列地址。

如果没有哈希冲突,散列表是一种非常高效的查找数据结构,其时间复杂度为O(1)

hash表类似于数组,不同于数组,数组的下标只能是数,hash表可以是任何东西,更像是python中的字典,但hash表是拥有o1)时间复杂度查找算法的存储结构。java中,我们使用hash表来存储的话。要考虑到hash的顺序问题,这就是问什么会有hashmaplinkedhashmap的原因了。

对于这道题,我们的思路就是循环一遍字符数组(这里的on)时间复杂度是无法避免的),把所有的字符存储到key的位置,value的位置用于计数。如果key重复(这种比对操作要控制在o1),就只能使用hash),则value的值增加。最后,只需要循环一遍,输出第一个value=1key就可以了。

import java.util.LinkedHashMap;
public class hashTable {
         publicstatic void main(String args[]){
                   Stringstr="abaccdeff";
                   LinkedHashMap<Character,Integer>hm=new LinkedHashMap<Character,Integer>();
                   char[]array=str.toCharArray();
                   for(inti=0;i<array.length;i++){
                            if(hm.containsKey(array[i])){//正是这里的比对是o(1),才能使总时间复杂度控制在线性复杂度
                                     hm.put(array[i],hm.get(array[i])+1);
                            }else{
                                     hm.put(array[i], 1);
                            }
                   }
                   for(chark:hm.keySet()){
                            if(hm.get(k)==1){
                                     System.out.println(k);
                                     break;
                            }
                   }
         }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值