由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 再来问道面经题
相关主题
请教两道CS题unsorted int array怎么找到第一个大于0,并且不在此array的数
C++ vector 问题一道算法题的follow up,求解
find median for k sorted arrays问个复杂度的初级问题
Google校园面试题heap里面delete一个非root的节点
贡献几道CS电面题求两个或N个数的最大公约数和最小公倍数
两道2009算法题C++ 程序求助
A simple google interview question请问一个C++题目
A Google Problem (2)One C++ question
相关话题的讨论汇总
话题: int话题: array话题: thelist话题: origlist话题: vector
进入JobHunting版参与讨论
1 (共1页)
l**o
发帖数: 356
1
给一个array比如[4,2,1,3,5],根据这个array现在我们能有了一个新的array => 每个
数是在原array里, 在它左边的所有比它大的number的个数,就是[0,1,2,1,0]. 题目是
现在给了这个[0,1,2,1,0]要求原array, 原来array的range是1~n
谢谢
e********2
发帖数: 495
2
递归



【在 l**o 的大作中提到】
: 给一个array比如[4,2,1,3,5],根据这个array现在我们能有了一个新的array => 每个
: 数是在原array里, 在它左边的所有比它大的number的个数,就是[0,1,2,1,0]. 题目是
: 现在给了这个[0,1,2,1,0]要求原array, 原来array的range是1~n
: 谢谢

d******b
发帖数: 73
3
1
21
321
4213
42135
l**o
发帖数: 356
4
能不能详细说说呀

递归

【在 e********2 的大作中提到】
: 递归
:
: 个

i*****h
发帖数: 1534
5
没看懂题目,囧
l********6
发帖数: 129
6
想不出n平方以下的解法
I******c
发帖数: 163
7
我的思路
[0,1,2,1,0] 从最右边的算起
第一个 是 0, 说明没有没有比它大的 所以这个数是 5
第二个 是 1, 说明有一个比他大,所以这个数是3 (4比它大)
第三个 是 2,说明有两个比他大,所以这个数是1 (2,4比它大)
类似。。。
结果应该是唯一的。
l********6
发帖数: 129
8
拿个数组装54321
从后往前第一个是0,就是5,remove,数组里面还剩下4321
接下来是1,就是3,remove,数组里还剩下421
接下来是2,就是1,remove,数组里还剩下42
接下来是1,就是2,remove,数组里还剩下4
接下来是0,就是4,remove,数组空
但是复杂度不知道该怎么办。。。

【在 I******c 的大作中提到】
: 我的思路
: [0,1,2,1,0] 从最右边的算起
: 第一个 是 0, 说明没有没有比它大的 所以这个数是 5
: 第二个 是 1, 说明有一个比他大,所以这个数是3 (4比它大)
: 第三个 是 2,说明有两个比他大,所以这个数是1 (2,4比它大)
: 类似。。。
: 结果应该是唯一的。

r*******g
发帖数: 1335
9
还是用bst的方法,但是每个节点要维护它下面节点的个数,也许segment tree也能做。
思路:
root就是第一个节点。对数组从左到右遍历,假设当前值为N,意味着,当把这个数插
入bst时候,有N个数比他大,也就是说有N个数在它插入后在它右边。因为每个节点维
护了它下面节点的个数,因此可以通过bst以lgN时间找到该节点应该插入的位置,这个
比较复杂,程序不好写。
最后得到了bst,也就得到了数值。
s*******n
发帖数: 305
10
public int[] recovery(int[] B){
int len = B.length;
int[] A = new int[len];
boolean[] flag = new boolean[len];

for(int i=0; i int biggerLeft = B[i];
for(int j=0; j if(flag[j]==true) continue;
if(biggerLeft==0){
flag[j]=true;
A[i]=j+1;
break;
} else {
biggerLeft--;
}
}
}
return A;
}
相关主题
两道2009算法题unsorted int array怎么找到第一个大于0,并且不在此array的数
A simple google interview question一道算法题的follow up,求解
A Google Problem (2)问个复杂度的初级问题
进入JobHunting版参与讨论
r*******g
发帖数: 1335
11
还是用bst的方法,但是每个节点要维护它下面节点的个数,也许segment tree也能做。
思路:
root就是第一个节点。对数组从左到右遍历,假设当前值为N,意味着,当把这个数插
入bst时候,有N个数比他大,也就是说有N个数在它插入后在它右边。因为每个节点维
护了它下面节点的个数,因此可以通过bst以lgN时间找到该节点应该插入的位置,这个
比较复杂,程序不好写。
最后得到了bst,也就得到了数值。
l********6
发帖数: 129
12
复杂度不还是n平方么??

【在 s*******n 的大作中提到】
: public int[] recovery(int[] B){
: int len = B.length;
: int[] A = new int[len];
: boolean[] flag = new boolean[len];
:
: for(int i=0; i: int biggerLeft = B[i];
: for(int j=0; j: if(flag[j]==true) continue;
: if(biggerLeft==0){

l******n
发帖数: 9344
13
o(n)
def recover( thelist ):
n = len(thelist)
origlist = range(1,n+1)
history = range(1,n+1)
for i in range(n-1,-1,-1):
if (i == n-1):
origlist[i] = n - thelist[i]
history.remove(origlist[i])
else:
index = i - thelist[i]
origlist[i] = history[index]
history.remove(origlist[i])
return(origlist)
def main():
thelist = [0,1,2,1,0]
print(recover(thelist))
if __name__=="__main__":
main()

【在 l********6 的大作中提到】
: 复杂度不还是n平方么??
l********6
发帖数: 129
14
history remove 复杂度多少
[在 longtian (有人的地方,就有江湖) 的大作中提到:]
:o(n)

:...........
l******n
发帖数: 9344
15
you are right,o(n^2)

【在 l********6 的大作中提到】
: history remove 复杂度多少
: [在 longtian (有人的地方,就有江湖) 的大作中提到:]
: :o(n)
: :
: :...........

y******g
发帖数: 4
16
test
y******g
发帖数: 4
17
How about this solution?
#include
#include
#include
using namespace std;
void print(vector &A) {
cout << "[";
int counter = 0;

for_each(A.begin(), A.end(), [&](int i) {
if (counter++) {
cout << ", ";
}
cout << i;
});

cout << "]" << endl;
};
vector solve(vector &A) {
vector result;

if (!A.empty()) {
vector candidates;
for (int i = (int)A.size(); i >=1; --i) {
candidates.emplace_back(i);
}

//print(candidates);

for_each(A.rbegin(), A.rend(), [&](int i) {
//cout << i << endl;
result.emplace_back(candidates[i]);
candidates.erase(candidates.begin()+i);
});
}

reverse(result.begin(), result.end());

return result;
};
int main() {
// your code goes here
vector A{0,1,2,1,0};

vector result;

result = solve(A);
print(result);

return 0;
}
s*********t
发帖数: 36
18
用 set (set is BST) 做
count array is [0, 1, 2, 1, 0]
1. base array is iset = [1, 2,, 3, 4, 5]
4th count = 0 -> (4-0) = 4th largest
4th val = iset.begin()+ 4 = 5
iset.erase(5)
2. array -> 1, 2, 3, 4
3rd count -> (3-1) =2nd largest
3rd val = iset.begin()+2 =3
iset.erase(3)
result: original array = 4 2 1 3 5
O(nlogn)
l********6
发帖数: 129
19
不知道你说的set是不是STL里的set,不过想提醒你一下,STL的set的iterator是
bidirectional iterator不是randomaccessiterator,namely,是不支持类似begin()
+ 4这种操作的

【在 s*********t 的大作中提到】
: 用 set (set is BST) 做
: count array is [0, 1, 2, 1, 0]
: 1. base array is iset = [1, 2,, 3, 4, 5]
: 4th count = 0 -> (4-0) = 4th largest
: 4th val = iset.begin()+ 4 = 5
: iset.erase(5)
: 2. array -> 1, 2, 3, 4
: 3rd count -> (3-1) =2nd largest
: 3rd val = iset.begin()+2 =3
: iset.erase(3)

p**********9
发帖数: 54
20
其实就转化成每次都找剩下数字里面第ai大得数字
用一个二叉树存1 ~ n, 然后记录每个节点左右节点数
删除一个节点和修正左右节点数都是logn
所有算法是O(nlogn)

【在 l********6 的大作中提到】
: 想不出n平方以下的解法
1 (共1页)
进入JobHunting版参与讨论
相关主题
One C++ question贡献几道CS电面题
const_reverse_iterator和reverse_iterator有什么区别?两道2009算法题
amazon phone interviewA simple google interview question
新手请教:C++ decrement loop (转载)A Google Problem (2)
请教两道CS题unsorted int array怎么找到第一个大于0,并且不在此array的数
C++ vector 问题一道算法题的follow up,求解
find median for k sorted arrays问个复杂度的初级问题
Google校园面试题heap里面delete一个非root的节点
相关话题的讨论汇总
话题: int话题: array话题: thelist话题: origlist话题: vector