牛客网---2016---去哪儿首个重复字符

来源:互联网 发布:s5230c软件 编辑:程序博客网 时间:2024/05/14 20:36

昨天兔子下雨了,瓢泼大雨,到屋就已经湿身了,衣服都能拧出水,就很无敌,然而今天依旧忘记带伞。。。

这里写图片描述

题目:
对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。
给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。
输入:
“qywyer23tdd”,11
输出:
y
解析:
1 . 我能想到的就是双for循环,可能有点简陋,先编写看看,再看看大神怎么编写的
解题所需函数:
1 . 获取String某一位置的函数,必须要使用charAt(),不要指望用A[u]就能获取得到,我就不写举例代码了
代码:

import java.util.*;public class FirstRepeat {    public char findFirstRepeat(String A, int n) {        // write code here        int res=0;        for(int i=1;i<n;i++){            if(res==0){                for (int j=i-1;j>=0;j--){                    if(A.charAt(j)==A.charAt(i)){                        res=i;                        break;                    }                }            }else{                break;            }        }        return A.charAt(res);    }}

大神de东西:
老子也不知道为啥人家写的代码就那么高端,什么hashmap,什么hashset之类的,就是利用了哈希思想,希望自己能学会,么么艹。
1 . 学会引入HashMap和HashSet包

import java.util.HashMap;import java.util.HashSet;

2 . 是时候介绍一波HashMap了
HashMap底层实现还是数组,只是数组的每一项都是一条链。

这里写图片描述

3 . 将字符转化为字符数组,啧啧,这样老弟就不用charAt这种鬼东西了

// 将字符串转化为字符数组,老实讲,这个真的不错char[] charArray = A.toCharArray();

4 . HashSet的add方法
使用add方法是,首先会判断对象是否是相同的,如果是相同的一定不会继续往里面加。如果对象是不同的,则加进去就好了。
判断是否相同不是通过肉眼就能判断的,是通过内部定义好了的equals方法来判断的,而用equals方法又是根据对象的hashCode来判断的。
感谢这位爸爸,啧啧

public class HashSetTest{    public static void main(String[] args)    {        HashSet hashSet = new HashSet();        hashSet.add(new Persion("zhangran"));        hashSet.add(new Persion("zhangran"));        System.out.println(hashSet);        System.out.println("以上为第一部分----------------");        Persion p1=new Persion("zhangran");        hashSet.add(p1);        hashSet.add(p1);        System.out.println(hashSet);        System.out.println("下面来的为第三部分------------");        String s1 = new String("aa");        String s2 = new String("aa");        hashSet.add(s1);        hashSet.add(s2);        System.out.println(hashSet);    }}class Persion{    String name;    Persion(String name)    {        this.name=name;    }}

答案是:第一部分加进去两个,第二部分跟第三部分加进去了一个。
比如第一部分中,Persion类是Object的子类继承了Object的equals和hashcode方法,而在Object类当中它的不同的实例中的hashcode是不同的,这是Object中本来就定义好了的hashcode;所以继承它的类也都有这样的方法,所以第一部分通过equals之后Persion的两个实例是不相同的。
在第三部分中,String类重写了hashcode方法,使得String实例化出来的对象的hashcode都是相同的,所以第三部分就得再进一步判断它的具体的数值,结果它的具体数值是相同的,所以插不进去。
4 . 我有搞到了HashMap和Hashtable和TreeMap

package test;import java.util.Map;    import java.util.HashMap;    import java.util.Set;    import java.util.HashSet;    import java.util.Iterator;    import java.util.Hashtable;    import java.util.TreeMap;    public class  niuke    {        public static void main(String[] args){            // 创建HashMap         Map map=new HashMap();                 // 加入数据 key-value        map.put("a", "aaa");            map.put("b", "bbb");            map.put("c", "ccc");            map.put("d", "ddd");            // 迭代器进行迭代HashMap 按照keySet()进行迭代        Iterator iterator = map.keySet().iterator();         // 如果iterator有下一个数据,则进行while循环        while (iterator.hasNext()) {            // Object key 等于iterator的下一位,对,下一个            Object key = iterator.next();                // 根据key获取value            System.out.println("map.get(key) is :"+map.get(key));            }        // 创建Hashtable        Hashtable tab=new Hashtable();         // key-value存储        tab.put("a", "aaa");            tab.put("b", "bbb");            tab.put("c", "ccc");            tab.put("d", "ddd");         // 创建迭代器        Iterator iterator_1 = tab.keySet().iterator();            while (iterator_1.hasNext()) {                Object key = iterator_1.next();                System.out.println("tab.get(key) is :"+tab.get(key));            }        // 创建TreeMap        TreeMap tmp=new TreeMap();                        tmp.put("a", "aaa");            tmp.put("b", "bbb");            tmp.put("c", "ccc");            tmp.put("d", "ddd");            Iterator iterator_2 = tmp.keySet().iterator();            while (iterator_2.hasNext()) {                Object key = iterator_2.next();                System.out.println("tmp.get(key) is :"+tmp.get(key));            }     }        }// 输出map.get(key) is :aaamap.get(key) is :bbbmap.get(key) is :cccmap.get(key) is :dddtab.get(key) is :bbbtab.get(key) is :aaatab.get(key) is :dddtab.get(key) is :ccctmp.get(key) is :aaatmp.get(key) is :bbbtmp.get(key) is :ccctmp.get(key) is :ddd

看结果就知道咋回事了
HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
大神代码:

// HashMap表示很受伤public char findFirstRepeat_1(String A, int n) {    // 创建HashMap    HashMap<Character, Integer> hm = new HashMap<Character, Integer>();    // 将字符串转化为字符数组,老实讲,这个真的不错    char[] charArray = A.toCharArray();    for (int i = 0; i < charArray.length; i++) {        // get和put操作,啧啧,上面有讲        if (hm.get(charArray[i]) == null) {            hm.put(charArray[i], 1);        } else {            return charArray[i];        }    }    // 明明之前有返回,但是这里没有返回也是要加上这个东东的    return '\n';}// 老子表示HashSet我也不懂啊public char findFirstRepeat_2(String A, int n) {    HashSet<Character> hm = new HashSet<Character>();    char[] charArray = A.toCharArray();    for (int i = 0; i < charArray.length; i++) {        // 能加入我们就多P,不能你就滚犊子,输出吧,骚年        if (hm.add(charArray[i])) {        } else {            return charArray[i];        }    }    return '\n';}// 数组模拟hash,表示很棒很无敌public char findFirstRepeat_3(String A, int n) {     char[] charArray = A.toCharArray();    // ASCII 范围  默认初始化为0    int[] hashChar = new int[256];     for (int i=0; i<charArray.length; i++) {        if (hashChar[charArray[i] - '0'] == 0) {            hashChar[charArray[i] - '0'] = 1;        } else {            return charArray[i];        }    }    return '\n';}
原创粉丝点击