《剑指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
- 剑指offer—数组中只出现一次的数字
- 剑指offer—数组中只出现一次的数字
- 剑指offer — 数组中只出现一次的数字
- 剑指offer--数组中只出现一次的数字
- 剑指Offer之 - 数组中只出现一次的数字
- [剑指Offer]40.数组中只出现一次的数字
- 剑指offer-40 数组中只出现一次的数字
- 剑指offer 数组中只出现一次的数字
- 剑指offer 40-数组中只出现一次的数字
- 《剑指offer》数组中只出现一次的数字
- 【剑指offer】之数组中只出现一次的数字
- [剑指offer-1351]数组中只出现一次的数字
- 剑指offer:数组中只出现一次的数字
- 剑指offer 40 数组中只出现一次的数字
- 剑指offer:数组中只出现一次的数字
- 剑指offer 数组中只出现一次的数字
- [剑指offer]数组中只出现一次的数字
- 剑指Offer--040-数组中只出现一次的数字
- ACM 刷题网址
- 有感《工业4.0时代,怎样为孩子筹备未来的教育》
- 仙剑奇侠传系列二
- hibernate继承关系映射方法(一)--共享一张表
- 几种C++分词软件
- 《剑指offer》——数组中只出现一次的数字
- NYOJ 236 心急的C小加(LIS)
- SSH+MVC的配置文件详解
- nlp
- jspdf.plugin.autotable.js---Basic example
- 函数内定义大数组出现段错误
- 大学生社会实践报告 模板
- Debian 7.6 64bit 驱动开发 内核源码树搭建
- Java 代码运行洞察库 Metrics