题目地址:
https://www.lintcode.com/problem/first-unique-number-in-data-stream/description
给定一个数组,再给定一个数 ,求从左向右扫描数组时在遇到 为止,第一个只出现过一次的数字。
思路是,用一个哈希表记录 之前的数是否是有重复的,key为数字,value为true如果有重复,false如果是unique的。最后扫描数组,直到发现第一个unique的数字就返回,否则返回 。代码如下:
import java.util.HashMap;
import java.util.Map;
public class Solution {
/**
* @param nums: a continuous stream of numbers
* @param number: a number
* @return: returns the first unique number
*/
public int firstUniqueNumber(int[] nums, int number) {
// Write your code here
if (nums == null || nums.length == 0) {
return -1;
}
Map<Integer, Boolean> map = new HashMap<>();
int ind = -1;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == number) {
ind = i;
break;
}
// 从这一句可以看出,如果一个数在出现第一次的时候,会put进false,之后再出现的时候就会put进true
map.put(nums[i], map.containsKey(nums[i]));
}
// 如果ind = -1说明number不存在,则返回-1
if (ind == -1) {
return -1;
}
// 接下来扫描number之前的数字,一旦发现unique的就返回
for (int i = 0; i < ind; i++) {
if (!map.get(nums[i])) {
return nums[i];
}
}
// 如果上面没返回,说明number本身是第一个unique的,则将其返回
return number;
}
}
时空复杂度 。