由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - an interview algorithm question about finding even occuring freq
相关主题
几道面试题MS intern 电面被拒,附上面试过程
find top K most occurring words in streaming data 这题怎么做比较好微软onsite
an interview question, find mode in a rolling window along data sequenceHashTable相关的面试题
这题怎么做?LeetCode上的Integer to Roman和 Roman to Integer
Given an array of N integers from range [0, N] and one is missing. Find the missing number.LC 387 怎么优化
continuous subarray of closest sub问几个老算法题的最佳解法
a problem from leetcode: high efficiency algorithm for combinations problemamazon phone interview questions
一道twitter的题amazon phone interview
相关话题的讨论汇总
话题: arr话题: int话题: integers话题: even话题: what
进入JobHunting版参与讨论
1 (共1页)
m****r
发帖数: 141
1
Design a method findEvenFreq(int[] a), which returns the single integer
value in the array which occurs with even frequency. Other numbers occur odd
numbers , which may be 7, 11 or even larger. All integers will be positive.
What if the integers are continuous.
For example, [1, 2, 3, 1] should return 1.
What if the integers may not be continuous.
example, [4, 8, 7, 5, 8 ] should return 8
The largest number can be INT_MAX.
I know how to solve it by hahstable.
Better ideas about O(1) space with O(n) time ?
thanks
l*****a
发帖数: 14598
2
I assume that you can only use a counter like
bool counter[65535];
int counter[65535]

odd
positive.

【在 m****r 的大作中提到】
: Design a method findEvenFreq(int[] a), which returns the single integer
: value in the array which occurs with even frequency. Other numbers occur odd
: numbers , which may be 7, 11 or even larger. All integers will be positive.
: What if the integers are continuous.
: For example, [1, 2, 3, 1] should return 1.
: What if the integers may not be continuous.
: example, [4, 8, 7, 5, 8 ] should return 8
: The largest number can be INT_MAX.
: I know how to solve it by hahstable.
: Better ideas about O(1) space with O(n) time ?

p*****2
发帖数: 21240
3
他要求O(1)space

【在 l*****a 的大作中提到】
: I assume that you can only use a counter like
: bool counter[65535];
: int counter[65535]
:
: odd
: positive.

l*****a
发帖数: 14598
4
我认为
固定space就是O(1)
所谓O(n)的意思是随着输入的增长,所需空间线性增长
。。。

【在 p*****2 的大作中提到】
: 他要求O(1)space
p*****2
发帖数: 21240
5

有道理。不过这个跟hashtable不一样吗?hashtable说不定比这个还省空间。而且如果
变成int64的话,空间不就增加了?
我怎么感觉应该用异或呢?不过我没导出来公式呢。

【在 l*****a 的大作中提到】
: 我认为
: 固定space就是O(1)
: 所谓O(n)的意思是随着输入的增长,所需空间线性增长
: 。。。

l*****a
发帖数: 14598
6
你说得对
但是只能这么做了。否则咋办
不知道LZ在那里看到的题。。。
异或感觉上肯定不成

【在 p*****2 的大作中提到】
:
: 有道理。不过这个跟hashtable不一样吗?hashtable说不定比这个还省空间。而且如果
: 变成int64的话,空间不就增加了?
: 我怎么感觉应该用异或呢?不过我没导出来公式呢。

q********c
发帖数: 1774
7
O(1) space means no extra space.Maybe we can use partition to solve this,
though don't have a solid idea now.
B******5
发帖数: 4676
8
这个要是design成bit operation会更合理吧
话说没出现过的数难道不也是偶数次?或许我强词夺理了。。。

【在 l*****a 的大作中提到】
: I assume that you can only use a counter like
: bool counter[65535];
: int counter[65535]
:
: odd
: positive.

j*****j
发帖数: 201
9
异或好像是只有一两个出现一次,其余都出现两次的情况

【在 p*****2 的大作中提到】
:
: 有道理。不过这个跟hashtable不一样吗?hashtable说不定比这个还省空间。而且如果
: 变成int64的话,空间不就增加了?
: 我怎么感觉应该用异或呢?不过我没导出来公式呢。

p*****2
发帖数: 21240
10

这个题不就是只有一个出现偶次数吗?

【在 j*****j 的大作中提到】
: 异或好像是只有一两个出现一次,其余都出现两次的情况
相关主题
continuous subarray of closest subMS intern 电面被拒,附上面试过程
a problem from leetcode: high efficiency algorithm for combinations problem微软onsite
一道twitter的题HashTable相关的面试题
进入JobHunting版参与讨论
l*****a
发帖数: 14598
11
那么多不一样的你怎么把它们消掉?

【在 p*****2 的大作中提到】
:
: 这个题不就是只有一个出现偶次数吗?

p*****2
发帖数: 21240
12

看错了。

【在 l*****a 的大作中提到】
: 那么多不一样的你怎么把它们消掉?
e****r
发帖数: 581
13
continuous & 数都只出现一次,even的出现两次
int findEvenFreq(vector& arr) {
int i = 0;
const int n = arr.size();
while (i < n) {
if (arr[i] < 0) {
i++; continue;
}
int j = arr[i] % n;
if (arr[i] + arr[j] == -1) return arr[i];
if (j > i) {
int t = arr[j];
arr[j] = -arr[i]-1;
arr[i] = t;
} else i++;
}
return -1;
}

odd
positive.

【在 m****r 的大作中提到】
: Design a method findEvenFreq(int[] a), which returns the single integer
: value in the array which occurs with even frequency. Other numbers occur odd
: numbers , which may be 7, 11 or even larger. All integers will be positive.
: What if the integers are continuous.
: For example, [1, 2, 3, 1] should return 1.
: What if the integers may not be continuous.
: example, [4, 8, 7, 5, 8 ] should return 8
: The largest number can be INT_MAX.
: I know how to solve it by hahstable.
: Better ideas about O(1) space with O(n) time ?

p*****2
发帖数: 21240
14
不都是正数吗?

【在 e****r 的大作中提到】
: continuous & 数都只出现一次,even的出现两次
: int findEvenFreq(vector& arr) {
: int i = 0;
: const int n = arr.size();
: while (i < n) {
: if (arr[i] < 0) {
: i++; continue;
: }
: int j = arr[i] % n;
: if (arr[i] + arr[j] == -1) return arr[i];

e****r
发帖数: 581
15
类似的方法可以做类似 1 1 1 2 2 这种很多数字出现频率可能高于1
就是对于数a[i],得把它放到j=a[i]%n的位置(n是数组长度)
如果:
(0) 如果a[i]已经在正确的位置(i==j)或者a[i]<0,直接i++
(1) a[j] == a[i],那么把a[j]变成-a[i]-1, i++
(2) a[j] == -a[i]-1,那么把a[j]变成a[i], i++
(3) otherwise,交换a[i]和a[j],i不变
空间O(1),时间O(n)
最后再O(n)找那个负数,假设是a[k]。返回-a[k]+1就行

【在 e****r 的大作中提到】
: continuous & 数都只出现一次,even的出现两次
: int findEvenFreq(vector& arr) {
: int i = 0;
: const int n = arr.size();
: while (i < n) {
: if (arr[i] < 0) {
: i++; continue;
: }
: int j = arr[i] % n;
: if (arr[i] + arr[j] == -1) return arr[i];

e****r
发帖数: 581
16
看15楼我的说明。那个code是只针对连续、每个数出现一次、一个数出现两次的
15楼我的说明是针对连续的情况,不限出现多少次

【在 p*****2 的大作中提到】
: 不都是正数吗?
p*****2
发帖数: 21240
17

(3)会不会死循环呢?

【在 e****r 的大作中提到】
: 类似的方法可以做类似 1 1 1 2 2 这种很多数字出现频率可能高于1
: 就是对于数a[i],得把它放到j=a[i]%n的位置(n是数组长度)
: 如果:
: (0) 如果a[i]已经在正确的位置(i==j)或者a[i]<0,直接i++
: (1) a[j] == a[i],那么把a[j]变成-a[i]-1, i++
: (2) a[j] == -a[i]-1,那么把a[j]变成a[i], i++
: (3) otherwise,交换a[i]和a[j],i不变
: 空间O(1),时间O(n)
: 最后再O(n)找那个负数,假设是a[k]。返回-a[k]+1就行

e****r
发帖数: 581
18
如果不连续,我的想法还是用类似的方法(其实就是hash)
稍微麻烦一些。相同的数hash(%)到一起,用一样的方法处理
不同的数hash到一起,得用open addressing
(0) 如果a[i]已经在正确的位置(i==j)或者a[i]<0,直接i++
(1) a[j] == a[i], a[j] <- -a[i]-1, i++
(2) a[j] == -a[i]-1, a[j] <- a[i], i++
(3) otherwise, 如果((a[j] > 0) && (a[j] % n == j)) || ((a[j] < 0) && ((-a[j]
+1) % n == j))就说明是collision了(我们估且认为不同的数hash到一起才是
collision)。没有collision的话,就直接交换a[i]和a[j],i不变
处理collision就用open addressing:一个一个搜索,知道找到一个尚未处理过的位置
,或者找到正确的hash slot
细节蛮多的,基本上就是实现open addressing了……
大概意思就是这样

【在 e****r 的大作中提到】
: 类似的方法可以做类似 1 1 1 2 2 这种很多数字出现频率可能高于1
: 就是对于数a[i],得把它放到j=a[i]%n的位置(n是数组长度)
: 如果:
: (0) 如果a[i]已经在正确的位置(i==j)或者a[i]<0,直接i++
: (1) a[j] == a[i],那么把a[j]变成-a[i]-1, i++
: (2) a[j] == -a[i]-1,那么把a[j]变成a[i], i++
: (3) otherwise,交换a[i]和a[j],i不变
: 空间O(1),时间O(n)
: 最后再O(n)找那个负数,假设是a[k]。返回-a[k]+1就行

e****r
发帖数: 581
19
不会,因为交换a[i]和a[j]后,原先的a[i]这个数在正确的位置(j),已经处理过了,
不会再处理这个数

【在 p*****2 的大作中提到】
:
: (3)会不会死循环呢?

e****r
发帖数: 581
20
刚漏了一点,改了
每次循环,如果a[i]已经在正确的位置,就直接i++什么都不用做
判断a[i]是否在正确的位置的依据是:
(j == i) || (a[i] < 0)

【在 p*****2 的大作中提到】
:
: (3)会不会死循环呢?

1 (共1页)
进入JobHunting版参与讨论
相关主题
amazon phone interviewGiven an array of N integers from range [0, N] and one is missing. Find the missing number.
amazon 一道题continuous subarray of closest sub
问个anagram的算法题a problem from leetcode: high efficiency algorithm for combinations problem
这题有啥好方法吗?一道twitter的题
几道面试题MS intern 电面被拒,附上面试过程
find top K most occurring words in streaming data 这题怎么做比较好微软onsite
an interview question, find mode in a rolling window along data sequenceHashTable相关的面试题
这题怎么做?LeetCode上的Integer to Roman和 Roman to Integer
相关话题的讨论汇总
话题: arr话题: int话题: integers话题: even话题: what