《剑指offer》——数组中只出现一次的数字

来源:互联网 发布:deepin 添加ubuntu 源 编辑:程序博客网 时间:2024/05/22 15:47

  • hashMap
  • 利用只出现一次的关系

T:

题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

题目类似于前两天做的一道题目:”第一个只出现一次的字符位置”。

但不同的是这次找出数组中,只出现一次的数字,仅仅是元素类别不同,结题方式就完全不同了。

hashMap

首先想到的是用hashMap去做,但是这种做法,并不算高效,解法没有第二种方法巧妙:

code:

    //num1,num2分别为长度为1的数组。传出参数    //将num1[0],num2[0]设置为返回结果    import java.util.HashMap;    import java.util.Iterator;    import java.util.Map;    import java.util.Map.Entry;    /**     * T: 数组中只出现一次的数字     *      * 题目描述      * 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。     *      * date: 2015.11.22  19:30     * @author SSS     *     */    public class Solution {        /**         * 采用HashSet         * @param array         * @param num1         * @param num2         */        public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {            if (array.length < 2 || array == null) {                num1[0] = 0;                num2[0] = 0;                return;            }            // key为array中的元素值,value为其出现的次数            HashMap<Integer, Integer> maps = new HashMap<Integer, Integer>();            for (int i = 0; i < array.length; i++) {                if (maps.get(array[i]) == null) {                    maps.put(array[i], 1);                } else {                    int counts = maps.get(array[i]);                    maps.remove(array[i]);                    maps.put(array[i], counts + 1);                }            }            Iterator iterator = maps.entrySet().iterator();            boolean flag = true;            while (iterator.hasNext()) {                Map.Entry entry = (Entry) iterator.next();                int value = (int) entry.getValue();                if (value == 1) {                    if (flag) {                        num1[0] = (int) entry.getKey();                        flag = false;                    } else {                        num2[0] = (int) entry.getKey();                        break;                    }                }            }        }    }

利用只出现一次的关系

既然只用两个元素在数组中出现了一次,其余的都是出现两次,那可有如下的巧妙解法:

code:

    //num1,num2分别为长度为1的数组。传出参数    //将num1[0],num2[0]设置为返回结果    import java.util.ArrayList;    import java.util.List;    /**     * T: 数组中只出现一次的数字     *      * 题目描述      * 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。     *      * date: 2015.11.22  20:18     * @author SSS     *     */    public class Solution {        /**         * 另一种巧妙解法         * @param array         * @param num1         * @param num2         */        public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {            List<Integer> arrlist = new ArrayList<Integer>();            for (int i = 0; i < array.length; i++) {                if (arrlist.contains(array[i])) {                    arrlist.remove(new Integer(array[i]));                } else {                    arrlist.add(array[i]);                }            }            if (arrlist.size() > 1) {                num1[0] = arrlist.get(0);                num2[0] = arrlist.get(1);            }        }    }

note:

对于List类型的remove()操作,有两种:
1. remove(int index);
2. remove(object o);

而我们这里要去除的显然是第二种,但是如果将代码中的:
arrlist.remove(new Integer(array[i]));
改为:
arrlist.remove(array[i]);
就由第二种变为了第一种,程序默认把array[i]当做一个下标了。

0 0
原创粉丝点击