avatar
j*p
1
电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
copy一份再用或者什么的
我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所
有组合
另一道是找到一个数组第二大的数,comparison的次数是3n/2, in place.
电面之后我就去翻书 c++ primer上都没有仔细介绍cast是怎么弄得。这种题对于计算
机系的人算容易题吗?有人能猜出来他要问什么吗?:(
avatar
p*n
2
请问版上前辈,谁有菊花脑的根啊,我想讨一些来种种。我是新农民,去年种了一些豇
豆,现在只有豇豆种子可以交换。
我在new jersey,运费我来出。
谢谢阿
avatar
a*m
3
这是最基本的c++题目了。一个直接用,一个dynamic_cast.

【在 j*p 的大作中提到】
: 电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
: 先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
: 数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
: 然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
: derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
: copy一份再用或者什么的
: 我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
: cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
: 位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

avatar
c*9
4
报Zip code。
avatar
q*x
5
啥公司?

【在 j*p 的大作中提到】
: 电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
: 先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
: 数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
: 然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
: derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
: copy一份再用或者什么的
: 我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
: cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
: 位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

avatar
p*n
6
我在edison,08817,谢谢
avatar
y*g
7
对cs来说是基础题目

【在 j*p 的大作中提到】
: 电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
: 先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
: 数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
: 然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
: derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
: copy一份再用或者什么的
: 我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
: cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
: 位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

avatar
g*h
8
跟着求。。很想要。
avatar
C*U
9
你说的找第二大的数字那个 是CRLS后面的一道练习题 好像是

【在 j*p 的大作中提到】
: 电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
: 先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
: 数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
: 然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
: derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
: copy一份再用或者什么的
: 我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
: cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
: 位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

avatar
b*t
10
同求, 95035.可以用湾区能买到的任何种子换。运费我来出。
avatar
j*p
11
刚才我想了一下,当时是说vtable的时候引出来的 他问的意思应该是 在进行类型转换
之后vtable怎么变化 比如
class Base
{
public:
virtual void v();
}
class Derived : public Base
{
public:
void v();
}
void main()
{
Drived D;
Derived *pd = &D;
Base* pb = dynamic_cast(pd);
}
本来pd指向D,D里面有一个指向Derived类的虚函数表的指针。现在被转成Base类的指针
pb了,pb还是指向D吗?印度人当时问 那个指针是不变呢还是另外copy什么什么。。。
如果是
Base B;
Base *pb = &B;
Derived* pd = dynamic_cast(pb);
pd指向B,还是要复制 B, 然后 在复制后的object里把虚函数表的指针改过来呢?
sigh~ 基本上没用过cast。。。这种题怎么复习得到嘛。。。

【在 a********m 的大作中提到】
: 这是最基本的c++题目了。一个直接用,一个dynamic_cast.
avatar
S*y
12
同求, 98004。愿出钱。
avatar
a*m
13
vtable当然不变,不然怎么知道如何调用正确的虚函数。而且所有同类对象都用同一个
vtable。
这个是c++基本概念,应该搞清楚的。不是是否经常用cast的问题。

【在 j*p 的大作中提到】
: 刚才我想了一下,当时是说vtable的时候引出来的 他问的意思应该是 在进行类型转换
: 之后vtable怎么变化 比如
: class Base
: {
: public:
: virtual void v();
: }
: class Derived : public Base
: {
: public:

avatar
h*i
14
土人我听都没听说过
avatar
a*m
15
想想也不是基本概念。不过是所有c++程序员应该清楚的。
就好像一个带虚函数的类和一个不带的,其他都完全一样,只有一个函数声明不同。这
两个类的sizeof()值有什么区别。
avatar
a*m
16
我有,马兰头,茼蒿也有一点,但得等我过一阵有空的时候来整理,需要自付运费。有
我想要的东西的ID优先。
avatar
j*p
17
麻烦你在解释一下吧 还是不懂 还是这个例子
class Base
{
public:
virtual void v();
};
class Derived : public Base
{
public:
void v();
};
void main()
{
Drived D;
Derived *pd = &D;
Base* pb = dynamic_cast(pd);
}
我如果用 (*pb)::v(),这个是调用Base::v() 还是Derived::v()? 应该是Base::v()吧
。但是如果这样的话,pb就不能指向D,因为D里面指向vtable的指针是指向Derived类的
vtable的。所以,pb 应该指向一个D的一个复制,这个复制中的指针指向Base类的
vtable?
我知道vtable是不变的 但是指向vtable的指针在cast之后变不变啊?

【在 a********m 的大作中提到】
: vtable当然不变,不然怎么知道如何调用正确的虚函数。而且所有同类对象都用同一个
: vtable。
: 这个是c++基本概念,应该搞清楚的。不是是否经常用cast的问题。

avatar
b*t
18
一种野菜(不知道算不算南京特别),用来烧蛋汤

【在 h*******i 的大作中提到】
: 土人我听都没听说过
avatar
A*u
19
借这位的问题我也问问
Base类对象里有一个指针,指向Base的虚函数表
Derived类对象里也有一个指针,指向dervied 虚函数表
我的问题是,这两个指针是什么类型的? 一样吗?
Derived *pt_d;
base* pt_b = pt_d;
这个指针赋值过程发生了什么呢?
pt_b 现在指向了 Derived? 它的虚函数指针值改为dervied的虚函数表地址了?
这些怎么实现的呢

【在 j*p 的大作中提到】
: 麻烦你在解释一下吧 还是不懂 还是这个例子
: class Base
: {
: public:
: virtual void v();
: };
: class Derived : public Base
: {
: public:
: void v();

avatar
s*l
20
同求马兰头和菊花脑。不知楼上要什么种子
avatar
A*u
21
同时找到 最大 和 第二大
3n/2 怎么来的

【在 j*p 的大作中提到】
: 电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
: 先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
: 数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
: 然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
: derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
: copy一份再用或者什么的
: 我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
: cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
: 位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

avatar
k*s
22
游士,你在哪里,这里的银民需要你
avatar
a*m
23
简单说几句。板上大牛多,俺板门弄斧下,再说大牛们估计也觉得说这个太简单了。如
果有错误请指出。谢先。另外俺用c/c++的前几年也不是很理解很多细节,只管记语法
,或者有些理解错误,所以刚开始用c++的童鞋不清楚这个的话也是正常的。
首先要知道c++对象和structure除了缺省private以外没有区别。都是一堆成员变量组
成一个内存块。
但是如果类有一个虚函数以后每个对象会在开头多一个指针变量。现在的机器和编译器
一般来说是4个字节。这个指针指向这个类的虚函数表,而且所有的同类对象的指针都
指向同一个表。虚函数调用是先去这个表查询一下(编译器会分配一个下标),调用函
数实际类似 _vtable[下标](.....),其中_vtable 相当于(*(void*)pobj).
编译器编译虚函数的时候不是生成函数跳转,而是生成一个下标。对于同一个函数,基
类和子类有不同的虚函数表,但是有相同的函数下标。所以做_vtable[下标]动作的时
候虚函数就是子类的的实际函数了,只要指针本身是正确的(指向子类或者基类,而不
是强制转成乱七八糟的指针)。总的来说编译器负责产生下标,而对象负责提供一个虚
函数表。理解这个以后其实c++的多态很容易理解,就是一个普通的共享函数指针数组。
上面那个问题的答案就是这个指针赋值只管指针变量本身赋值(4字节或者8字节),和
其他任何普通类型的赋值没有区别。实际指向的内存块的内容没有任何改变,而内存块
的开始就是这个对象虚函数表的指针。
avatar
p*o
24
我也在new jersey,07728, 同求菊花脑种子

【在 p*******n 的大作中提到】
: 请问版上前辈,谁有菊花脑的根啊,我想讨一些来种种。我是新农民,去年种了一些豇
: 豆,现在只有豇豆种子可以交换。
: 我在new jersey,运费我来出。
: 谢谢阿

avatar
a*m
25
找最大的是用一个变量保存然后扫描一下就可以了吧。找两个是用两个变量保存。。。。

【在 A**u 的大作中提到】
: 同时找到 最大 和 第二大
: 3n/2 怎么来的

avatar
p*o
26
南京特有,很怀念那种清香。

【在 b********t 的大作中提到】
: 一种野菜(不知道算不算南京特别),用来烧蛋汤
avatar
A*u
27
负责任地告诉你
这需要2N次

。。

【在 a********m 的大作中提到】
: 找最大的是用一个变量保存然后扫描一下就可以了吧。找两个是用两个变量保存。。。。
avatar
Q*g
28
我家去年就培养活了5棵~来年肥沃了我来贡献哈老乡们
avatar
A*u
29
明白了
辛苦了,码了这么多字

【在 a********m 的大作中提到】
: 简单说几句。板上大牛多,俺板门弄斧下,再说大牛们估计也觉得说这个太简单了。如
: 果有错误请指出。谢先。另外俺用c/c++的前几年也不是很理解很多细节,只管记语法
: ,或者有些理解错误,所以刚开始用c++的童鞋不清楚这个的话也是正常的。
: 首先要知道c++对象和structure除了缺省private以外没有区别。都是一堆成员变量组
: 成一个内存块。
: 但是如果类有一个虚函数以后每个对象会在开头多一个指针变量。现在的机器和编译器
: 一般来说是4个字节。这个指针指向这个类的虚函数表,而且所有的同类对象的指针都
: 指向同一个表。虚函数调用是先去这个表查询一下(编译器会分配一个下标),调用函
: 数实际类似 _vtable[下标](.....),其中_vtable 相当于(*(void*)pobj).
: 编译器编译虚函数的时候不是生成函数跳转,而是生成一个下标。对于同一个函数,基

avatar
D*0
30
我有阿,很多。这东西怎么邮寄呢?能移活吗?
avatar
a*m
31
恩。这样的话最坏是2n。

【在 A**u 的大作中提到】
: 负责任地告诉你
: 这需要2N次
:
: 。。

avatar
f*f
32
南京人很想念这家乡的味道,同求
avatar
k*n
33
每两个比较,把大的换到前面,n/2次
n/2个里面挑最大的,n/2次
剩下的n/2-1再加上刚才最大的配对的那个里面挑最大的,又是n/2次

。。

【在 a********m 的大作中提到】
: 找最大的是用一个变量保存然后扫描一下就可以了吧。找两个是用两个变量保存。。。。
avatar
m*p
34
qiuqiuqiu
avatar
a*m
35
赞。

【在 k****n 的大作中提到】
: 每两个比较,把大的换到前面,n/2次
: n/2个里面挑最大的,n/2次
: 剩下的n/2-1再加上刚才最大的配对的那个里面挑最大的,又是n/2次
:
: 。。

avatar
j*p
36
哈哈 我就是这么答得 结果他说 swap的次数也要最少!然后就又在这里纠缠了20多分
钟。。。

【在 k****n 的大作中提到】
: 每两个比较,把大的换到前面,n/2次
: n/2个里面挑最大的,n/2次
: 剩下的n/2-1再加上刚才最大的配对的那个里面挑最大的,又是n/2次
:
: 。。

avatar
j*p
37
还是不明白。。。 能不能按我的思路 回答一下下面的问题啊
还是上面的例子
(1) 用 Base* pb = dynamic_cast(pd); 和 Base* pb = pd; 效果 一样吗
(我觉得不一样吧)
(2) 如果不一样,如果用 Base* pb = dynamic_cast(pd); 之后, 调用(*pb
)::v() 是调用 Base::v() 的话,这个是怎么实现的呢?(pb 就不能指到D上了 否则就
调用D里面的 Derived::v()了)
Thanks!:)

【在 a********m 的大作中提到】
: 简单说几句。板上大牛多,俺板门弄斧下,再说大牛们估计也觉得说这个太简单了。如
: 果有错误请指出。谢先。另外俺用c/c++的前几年也不是很理解很多细节,只管记语法
: ,或者有些理解错误,所以刚开始用c++的童鞋不清楚这个的话也是正常的。
: 首先要知道c++对象和structure除了缺省private以外没有区别。都是一堆成员变量组
: 成一个内存块。
: 但是如果类有一个虚函数以后每个对象会在开头多一个指针变量。现在的机器和编译器
: 一般来说是4个字节。这个指针指向这个类的虚函数表,而且所有的同类对象的指针都
: 指向同一个表。虚函数调用是先去这个表查询一下(编译器会分配一个下标),调用函
: 数实际类似 _vtable[下标](.....),其中_vtable 相当于(*(void*)pobj).
: 编译器编译虚函数的时候不是生成函数跳转,而是生成一个下标。对于同一个函数,基

avatar
j*p
38
不好意思 当时我理解是in place 后来他说可以开几个内存,不过和数组长度无关
我先不post答案了

【在 k****n 的大作中提到】
: 每两个比较,把大的换到前面,n/2次
: n/2个里面挑最大的,n/2次
: 剩下的n/2-1再加上刚才最大的配对的那个里面挑最大的,又是n/2次
:
: 。。

avatar
a*m
39
1. 结果没区别。不确定编译器会不会先查一下类信息。最后反正是指向同一个内存地
址。反过来pb->pd的时候编译器会运行时查类信息,看是不是合法cast再决定结果。
2. 如果v是虚函数,就调用pd版本。如果是普通函数,调用地址是根据当前类决定的,
调用pb版本。


pb

【在 j*p 的大作中提到】
: 还是不明白。。。 能不能按我的思路 回答一下下面的问题啊
: 还是上面的例子
: (1) 用 Base* pb = dynamic_cast(pd); 和 Base* pb = pd; 效果 一样吗
: (我觉得不一样吧)
: (2) 如果不一样,如果用 Base* pb = dynamic_cast(pd); 之后, 调用(*pb
: )::v() 是调用 Base::v() 的话,这个是怎么实现的呢?(pb 就不能指到D上了 否则就
: 调用D里面的 Derived::v()了)
: Thanks!:)

avatar
A*u
40
他要你写代码了吗
递归算不算 in place?

【在 j*p 的大作中提到】
: 哈哈 我就是这么答得 结果他说 swap的次数也要最少!然后就又在这里纠缠了20多分
: 钟。。。

avatar
w*x
41
3n/2的基本思想是这样的:
一开始有两个数, 知道最大的和第二大的
对第3个比较的第二大的数, 比较一次后可得两个数, 不知道谁最大谁最小
对第四个数分别比较这不知道位置的两个数, 比较两次得出谁最大谁最小
第5个数情况和第3个相同...
就是比较次数: 1, 2, 1, 2, 1, 2, 1, 2 ... 就是3n/2了
自己想出来的, wa ka ka
avatar
j*p
42

所以dynamic_cast只是负责检查了一下类型 没有其他作用。。。 我还以为这个东西有
多牛呢。怪不得被印度人鄙视了,sigh~
btw,刚才又查了一下primer,从base类到derived类要用static_cast,dynamic_cast会返
回空指针
thanks for answers!

【在 a********m 的大作中提到】
: 1. 结果没区别。不确定编译器会不会先查一下类信息。最后反正是指向同一个内存地
: 址。反过来pb->pd的时候编译器会运行时查类信息,看是不是合法cast再决定结果。
: 2. 如果v是虚函数,就调用pd版本。如果是普通函数,调用地址是根据当前类决定的,
: 调用pb版本。
:
: 吗
: pb

avatar
j*p
43

两次就够了?

【在 w****x 的大作中提到】
: 3n/2的基本思想是这样的:
: 一开始有两个数, 知道最大的和第二大的
: 对第3个比较的第二大的数, 比较一次后可得两个数, 不知道谁最大谁最小
: 对第四个数分别比较这不知道位置的两个数, 比较两次得出谁最大谁最小
: 第5个数情况和第3个相同...
: 就是比较次数: 1, 2, 1, 2, 1, 2, 1, 2 ... 就是3n/2了
: 自己想出来的, wa ka ka

avatar
j*p
44
递归要看是不是in place的递归啊
反正 如果完全in place的话 那个两两一组的方法应该最好了 加上递归效果一样 也是
3n/2 加上很多swap
你慢慢想 我睡觉去了 :)

【在 A**u 的大作中提到】
: 他要你写代码了吗
: 递归算不算 in place?

avatar
a*m
45
dynamic会根据RTTI检查合法性,也看你的编译选项。这个是基本知识,不高级,但是
这个cast还是做了一些事情的。
如果你的dynamic cast返回null说明你的cast有问题。static强制过去了虽然成功了但
是实际是错的。不是说“要用static_cast”。

【在 j*p 的大作中提到】
: 递归要看是不是in place的递归啊
: 反正 如果完全in place的话 那个两两一组的方法应该最好了 加上递归效果一样 也是
: 3n/2 加上很多swap
: 你慢慢想 我睡觉去了 :)

avatar
r*t
46
啥时候 cast 会 copy, or ever change at all?

【在 j*p 的大作中提到】
: 刚才我想了一下,当时是说vtable的时候引出来的 他问的意思应该是 在进行类型转换
: 之后vtable怎么变化 比如
: class Base
: {
: public:
: virtual void v();
: }
: class Derived : public Base
: {
: public:

avatar
r*t
47
Base* pb = pd; 能编译得过么?

【在 a********m 的大作中提到】
: 1. 结果没区别。不确定编译器会不会先查一下类信息。最后反正是指向同一个内存地
: 址。反过来pb->pd的时候编译器会运行时查类信息,看是不是合法cast再决定结果。
: 2. 如果v是虚函数,就调用pd版本。如果是普通函数,调用地址是根据当前类决定的,
: 调用pb版本。
:
: 吗
: pb

avatar
a*2
48
算法导论原题, n+logn-2

【在 j*p 的大作中提到】
: 不好意思 当时我理解是in place 后来他说可以开几个内存,不过和数组长度无关
: 我先不post答案了

avatar
G*e
49
But this is not an in-place algorithm

【在 k****n 的大作中提到】
: 每两个比较,把大的换到前面,n/2次
: n/2个里面挑最大的,n/2次
: 剩下的n/2-1再加上刚才最大的配对的那个里面挑最大的,又是n/2次
:
: 。。

avatar
A*u
50
为啥

【在 G******e 的大作中提到】
: But this is not an in-place algorithm
avatar
G*e
51
Because it needs to swap between elements at positions 2i-1 and 2i during
the first phase.

【在 A**u 的大作中提到】
: 为啥
avatar
G*e
52
This is cute!

【在 w****x 的大作中提到】
: 3n/2的基本思想是这样的:
: 一开始有两个数, 知道最大的和第二大的
: 对第3个比较的第二大的数, 比较一次后可得两个数, 不知道谁最大谁最小
: 对第四个数分别比较这不知道位置的两个数, 比较两次得出谁最大谁最小
: 第5个数情况和第3个相同...
: 就是比较次数: 1, 2, 1, 2, 1, 2, 1, 2 ... 就是3n/2了
: 自己想出来的, wa ka ka

avatar
A*u
53
对不起 我非cs,
请教一下, in place 意思不是不需要开额外内存?
swap 没用内存

【在 G******e 的大作中提到】
: Because it needs to swap between elements at positions 2i-1 and 2i during
: the first phase.

avatar
G*e
54
sorry, you are right. It is in-place. Somehow I had thought the algorithm
should treat the input as read-only:(

【在 A**u 的大作中提到】
: 对不起 我非cs,
: 请教一下, in place 意思不是不需要开额外内存?
: swap 没用内存

avatar
q*x
55
3rd edition, which page?

【在 a**********2 的大作中提到】
: 算法导论原题, n+logn-2
avatar
G*e
56
2nd edition, exercise 9.1-1 (Chapter 9 Medians and Order Statistics, Section
9.1 Minimum and maximum, you probably can find it easily in the 3rd edition
as well).
But I doubt if you can achieve this with an in-place algorithm. For that
exercise you can build a binary tree to get n+logn comparisons but extra
space seems necessary.

【在 q****x 的大作中提到】
: 3rd edition, which page?
avatar
j*p
57
Yes, you're right. :) 当时看primer的时候这个没仔细看 知识点有漏洞啊 :(

【在 a********m 的大作中提到】
: dynamic会根据RTTI检查合法性,也看你的编译选项。这个是基本知识,不高级,但是
: 这个cast还是做了一些事情的。
: 如果你的dynamic cast返回null说明你的cast有问题。static强制过去了虽然成功了但
: 是实际是错的。不是说“要用static_cast”。

avatar
j*p
58
当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
了 f(n)=n/2 + f(n/2) 然后 不知道怎么想的 一直觉得这个得到f(n)=3n/2 :(
刚查了一下 递归公式 f(n)=n/2 + f(n/2) + 1 所以应该是 f(n)= n + log(n) - 2.
这个方法主要问题是要用n/2次swap。那个印度人后来说要minimize swap的次数。我就
很郁闷 因为已经超时了 后来他告我答案了:
不是把数分成n/2组每组两个,要把数分成2组每组n/2个。每组选最大的。比较之后,
较大的就是最大的那个数。较小的和较大的数所在的组里的其他数组成一组,再选最大
的,就得到第二大数了。一共大概3n/2次 用到了一两个额外的内存。
简单吧!:)

【在 a**********2 的大作中提到】
: 算法导论原题, n+logn-2
avatar
a*m
59
? 为啥不能?

【在 r****t 的大作中提到】
: Base* pb = pd; 能编译得过么?
avatar
r*t
60
就是猜,这样初始化是不是该有个 warning 呢?

【在 a********m 的大作中提到】
: ? 为啥不能?
avatar
y*g
61
为什么有warning?subclass的含义是is a

【在 r****t 的大作中提到】
: 就是猜,这样初始化是不是该有个 warning 呢?
avatar
r*t
62
you are totally right.

【在 y*******g 的大作中提到】
: 为什么有warning?subclass的含义是is a
avatar
r*t
63
那一个 pointer 是 Derived* 还是 Base* 对解析被调用的成员函数没有啥影响?
唯一的区别是 Derived* 可以初始化 Based*,
反过来则必须 dynamic_cast (static_cast 合法不?)

【在 a********m 的大作中提到】
: 1. 结果没区别。不确定编译器会不会先查一下类信息。最后反正是指向同一个内存地
: 址。反过来pb->pd的时候编译器会运行时查类信息,看是不是合法cast再决定结果。
: 2. 如果v是虚函数,就调用pd版本。如果是普通函数,调用地址是根据当前类决定的,
: 调用pb版本。
:
: 吗
: pb

avatar
r*t
64
第 4 个数不行的

【在 w****x 的大作中提到】
: 3n/2的基本思想是这样的:
: 一开始有两个数, 知道最大的和第二大的
: 对第3个比较的第二大的数, 比较一次后可得两个数, 不知道谁最大谁最小
: 对第四个数分别比较这不知道位置的两个数, 比较两次得出谁最大谁最小
: 第5个数情况和第3个相同...
: 就是比较次数: 1, 2, 1, 2, 1, 2, 1, 2 ... 就是3n/2了
: 自己想出来的, wa ka ka

avatar
r*t
65
这办法很通用啊。请问算法导论的作者名是啥(离 cs 太远了,表喷饭)?俺想下载学习。

【在 j*p 的大作中提到】
: 当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
: 了 f(n)=n/2 + f(n/2) 然后 不知道怎么想的 一直觉得这个得到f(n)=3n/2 :(
: 刚查了一下 递归公式 f(n)=n/2 + f(n/2) + 1 所以应该是 f(n)= n + log(n) - 2.
: 这个方法主要问题是要用n/2次swap。那个印度人后来说要minimize swap的次数。我就
: 很郁闷 因为已经超时了 后来他告我答案了:
: 不是把数分成n/2组每组两个,要把数分成2组每组n/2个。每组选最大的。比较之后,
: 较大的就是最大的那个数。较小的和较大的数所在的组里的其他数组成一组,再选最大
: 的,就得到第二大数了。一共大概3n/2次 用到了一两个额外的内存。
: 简单吧!:)

avatar
k*n
66
CLRS

习。

【在 r****t 的大作中提到】
: 这办法很通用啊。请问算法导论的作者名是啥(离 cs 太远了,表喷饭)?俺想下载学习。
avatar
a*m
67
区别是base*不能调用derived的成员函数呀。因为这个对象现在是一个base对象。
static是属于强制。你要告诉编译器“不要管我,把类型改了就成了”

【在 r****t 的大作中提到】
: 那一个 pointer 是 Derived* 还是 Base* 对解析被调用的成员函数没有啥影响?
: 唯一的区别是 Derived* 可以初始化 Based*,
: 反过来则必须 dynamic_cast (static_cast 合法不?)

avatar
r*t
68
喔对了,把最基本的忘了,惨了惨了。

【在 a********m 的大作中提到】
: 区别是base*不能调用derived的成员函数呀。因为这个对象现在是一个base对象。
: static是属于强制。你要告诉编译器“不要管我,把类型改了就成了”

avatar
r*t
69
谢了,找了个第二版。要是学算法的话, CLRS 和 Kleinberg & Tardos 之间如何比较
?我有后者的纸书,两个都是大部头,想 focus 一个。

【在 k****n 的大作中提到】
: CLRS
:
: 习。

avatar
k*n
70
后者我不知道,CLRS是绝对够用了,对于算法和数据结构基础入门来说

【在 r****t 的大作中提到】
: 谢了,找了个第二版。要是学算法的话, CLRS 和 Kleinberg & Tardos 之间如何比较
: ?我有后者的纸书,两个都是大部头,想 focus 一个。

avatar
r*t
71
谢谢!

【在 k****n 的大作中提到】
: 后者我不知道,CLRS是绝对够用了,对于算法和数据结构基础入门来说
avatar
A*u
72
不好...

【在 j*p 的大作中提到】
: 当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
: 了 f(n)=n/2 + f(n/2) 然后 不知道怎么想的 一直觉得这个得到f(n)=3n/2 :(
: 刚查了一下 递归公式 f(n)=n/2 + f(n/2) + 1 所以应该是 f(n)= n + log(n) - 2.
: 这个方法主要问题是要用n/2次swap。那个印度人后来说要minimize swap的次数。我就
: 很郁闷 因为已经超时了 后来他告我答案了:
: 不是把数分成n/2组每组两个,要把数分成2组每组n/2个。每组选最大的。比较之后,
: 较大的就是最大的那个数。较小的和较大的数所在的组里的其他数组成一组,再选最大
: 的,就得到第二大数了。一共大概3n/2次 用到了一两个额外的内存。
: 简单吧!:)

avatar
a*2
73
选出了最大的那个数以后,较小的数不需要跟较大数理的每个数进行比较,只需要跟那些
跟最大数比较过的数进行比较,所以
是logn 而不是n/2

【在 j*p 的大作中提到】
: 当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
: 了 f(n)=n/2 + f(n/2) 然后 不知道怎么想的 一直觉得这个得到f(n)=3n/2 :(
: 刚查了一下 递归公式 f(n)=n/2 + f(n/2) + 1 所以应该是 f(n)= n + log(n) - 2.
: 这个方法主要问题是要用n/2次swap。那个印度人后来说要minimize swap的次数。我就
: 很郁闷 因为已经超时了 后来他告我答案了:
: 不是把数分成n/2组每组两个,要把数分成2组每组n/2个。每组选最大的。比较之后,
: 较大的就是最大的那个数。较小的和较大的数所在的组里的其他数组成一组,再选最大
: 的,就得到第二大数了。一共大概3n/2次 用到了一两个额外的内存。
: 简单吧!:)

avatar
g*i
74
winner tree

【在 a**********2 的大作中提到】
: 选出了最大的那个数以后,较小的数不需要跟较大数理的每个数进行比较,只需要跟那些
: 跟最大数比较过的数进行比较,所以
: 是logn 而不是n/2

avatar
q*x
75
要求O(1) space的话,怎么记住哪些数和最大数比较过?

【在 a**********2 的大作中提到】
: 选出了最大的那个数以后,较小的数不需要跟较大数理的每个数进行比较,只需要跟那些
: 跟最大数比较过的数进行比较,所以
: 是logn 而不是n/2

avatar
A*u
76
no in place

【在 g*****i 的大作中提到】
: winner tree
avatar
C*U
77
i told them at beginning, no body noticed>\?

【在 a**********2 的大作中提到】
: 算法导论原题, n+logn-2
avatar
z*t
78
题目“找出两个数之和是那个给定值的所有组合”可以参考
http://codercareer.blogspot.com/2011/10/no-09-numbers-with-give
这个博客的解法需要先排序数组。如果数组是无序的,排序先。

【在 j*p 的大作中提到】
: 电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
: 先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
: 数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
: 然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
: derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
: copy一份再用或者什么的
: 我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
: cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
: 位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

avatar
a*d
79
From autumnworm,叙事清楚,学习了。
另外求第二大的那个好像是quickselect的
n/2+n/4+n/8........直到(n==2||n==3)?
avatar
a*d
80
From autumnworm,叙事清楚,学习了。
另外求第二大的那个好像是quickselect的
n/2+n/4+n/8........直到(n==2||n==3)?
avatar
s*n
81
good one

【在 j*p 的大作中提到】
: 当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
: 了 f(n)=n/2 + f(n/2) 然后 不知道怎么想的 一直觉得这个得到f(n)=3n/2 :(
: 刚查了一下 递归公式 f(n)=n/2 + f(n/2) + 1 所以应该是 f(n)= n + log(n) - 2.
: 这个方法主要问题是要用n/2次swap。那个印度人后来说要minimize swap的次数。我就
: 很郁闷 因为已经超时了 后来他告我答案了:
: 不是把数分成n/2组每组两个,要把数分成2组每组n/2个。每组选最大的。比较之后,
: 较大的就是最大的那个数。较小的和较大的数所在的组里的其他数组成一组,再选最大
: 的,就得到第二大数了。一共大概3n/2次 用到了一两个额外的内存。
: 简单吧!:)

avatar
c*p
82
一个稍微复杂一点的解法:
iterate over array with step = 2;
{
first, compare the a[i], a[i+1];
second, compare the first_max_so_far with max of a[i], a[i+1] to get new
first_max_so_far;
third, based on comparison result from second step, we can get the second_
max_so_far by
compare (first_max_so_far, min) or (second_max_so_far, max)
}
returns second_max_so_far;
complexity:
for every two elements in the array, at most three comparisons. So total
complexity is (n/2) * 3.
And no swap needed.


【在 j*p 的大作中提到】
: 当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
: 了 f(n)=n/2 + f(n/2) 然后 不知道怎么想的 一直觉得这个得到f(n)=3n/2 :(
: 刚查了一下 递归公式 f(n)=n/2 + f(n/2) + 1 所以应该是 f(n)= n + log(n) - 2.
: 这个方法主要问题是要用n/2次swap。那个印度人后来说要minimize swap的次数。我就
: 很郁闷 因为已经超时了 后来他告我答案了:
: 不是把数分成n/2组每组两个,要把数分成2组每组n/2个。每组选最大的。比较之后,
: 较大的就是最大的那个数。较小的和较大的数所在的组里的其他数组成一组,再选最大
: 的,就得到第二大数了。一共大概3n/2次 用到了一两个额外的内存。
: 简单吧!:)

avatar
j*p
83
电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
copy一份再用或者什么的
我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所
有组合
另一道是找到一个数组第二大的数,comparison的次数是3n/2, in place.
电面之后我就去翻书 c++ primer上都没有仔细介绍cast是怎么弄得。这种题对于计算
机系的人算容易题吗?有人能猜出来他要问什么吗?:(
avatar
a*m
84
这是最基本的c++题目了。一个直接用,一个dynamic_cast.

【在 j*p 的大作中提到】
: 电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
: 先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
: 数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
: 然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
: derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
: copy一份再用或者什么的
: 我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
: cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
: 位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

avatar
q*x
85
啥公司?

【在 j*p 的大作中提到】
: 电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
: 先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
: 数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
: 然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
: derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
: copy一份再用或者什么的
: 我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
: cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
: 位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

avatar
y*g
86
对cs来说是基础题目

【在 j*p 的大作中提到】
: 电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
: 先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
: 数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
: 然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
: derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
: copy一份再用或者什么的
: 我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
: cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
: 位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

avatar
C*U
87
你说的找第二大的数字那个 是CRLS后面的一道练习题 好像是

【在 j*p 的大作中提到】
: 电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
: 先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
: 数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
: 然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
: derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
: copy一份再用或者什么的
: 我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
: cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
: 位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

avatar
j*p
88
刚才我想了一下,当时是说vtable的时候引出来的 他问的意思应该是 在进行类型转换
之后vtable怎么变化 比如
class Base
{
public:
virtual void v();
}
class Derived : public Base
{
public:
void v();
}
void main()
{
Drived D;
Derived *pd = &D;
Base* pb = dynamic_cast(pd);
}
本来pd指向D,D里面有一个指向Derived类的虚函数表的指针。现在被转成Base类的指针
pb了,pb还是指向D吗?印度人当时问 那个指针是不变呢还是另外copy什么什么。。。
如果是
Base B;
Base *pb = &B;
Derived* pd = dynamic_cast(pb);
pd指向B,还是要复制 B, 然后 在复制后的object里把虚函数表的指针改过来呢?
sigh~ 基本上没用过cast。。。这种题怎么复习得到嘛。。。

【在 a********m 的大作中提到】
: 这是最基本的c++题目了。一个直接用,一个dynamic_cast.
avatar
a*m
89
vtable当然不变,不然怎么知道如何调用正确的虚函数。而且所有同类对象都用同一个
vtable。
这个是c++基本概念,应该搞清楚的。不是是否经常用cast的问题。

【在 j*p 的大作中提到】
: 刚才我想了一下,当时是说vtable的时候引出来的 他问的意思应该是 在进行类型转换
: 之后vtable怎么变化 比如
: class Base
: {
: public:
: virtual void v();
: }
: class Derived : public Base
: {
: public:

avatar
a*m
90
想想也不是基本概念。不过是所有c++程序员应该清楚的。
就好像一个带虚函数的类和一个不带的,其他都完全一样,只有一个函数声明不同。这
两个类的sizeof()值有什么区别。
avatar
j*p
91
麻烦你在解释一下吧 还是不懂 还是这个例子
class Base
{
public:
virtual void v();
};
class Derived : public Base
{
public:
void v();
};
void main()
{
Drived D;
Derived *pd = &D;
Base* pb = dynamic_cast(pd);
}
我如果用 (*pb)::v(),这个是调用Base::v() 还是Derived::v()? 应该是Base::v()吧
。但是如果这样的话,pb就不能指向D,因为D里面指向vtable的指针是指向Derived类的
vtable的。所以,pb 应该指向一个D的一个复制,这个复制中的指针指向Base类的
vtable?
我知道vtable是不变的 但是指向vtable的指针在cast之后变不变啊?

【在 a********m 的大作中提到】
: vtable当然不变,不然怎么知道如何调用正确的虚函数。而且所有同类对象都用同一个
: vtable。
: 这个是c++基本概念,应该搞清楚的。不是是否经常用cast的问题。

avatar
A*u
92
借这位的问题我也问问
Base类对象里有一个指针,指向Base的虚函数表
Derived类对象里也有一个指针,指向dervied 虚函数表
我的问题是,这两个指针是什么类型的? 一样吗?
Derived *pt_d;
base* pt_b = pt_d;
这个指针赋值过程发生了什么呢?
pt_b 现在指向了 Derived? 它的虚函数指针值改为dervied的虚函数表地址了?
这些怎么实现的呢

【在 j*p 的大作中提到】
: 麻烦你在解释一下吧 还是不懂 还是这个例子
: class Base
: {
: public:
: virtual void v();
: };
: class Derived : public Base
: {
: public:
: void v();

avatar
A*u
93
同时找到 最大 和 第二大
3n/2 怎么来的

【在 j*p 的大作中提到】
: 电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
: 先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
: 数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
: 然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
: derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
: copy一份再用或者什么的
: 我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
: cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
: 位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

avatar
a*m
94
简单说几句。板上大牛多,俺板门弄斧下,再说大牛们估计也觉得说这个太简单了。如
果有错误请指出。谢先。另外俺用c/c++的前几年也不是很理解很多细节,只管记语法
,或者有些理解错误,所以刚开始用c++的童鞋不清楚这个的话也是正常的。
首先要知道c++对象和structure除了缺省private以外没有区别。都是一堆成员变量组
成一个内存块。
但是如果类有一个虚函数以后每个对象会在开头多一个指针变量。现在的机器和编译器
一般来说是4个字节。这个指针指向这个类的虚函数表,而且所有的同类对象的指针都
指向同一个表。虚函数调用是先去这个表查询一下(编译器会分配一个下标),调用函
数实际类似 _vtable[下标](.....),其中_vtable 相当于(*(void*)pobj).
编译器编译虚函数的时候不是生成函数跳转,而是生成一个下标。对于同一个函数,基
类和子类有不同的虚函数表,但是有相同的函数下标。所以做_vtable[下标]动作的时
候虚函数就是子类的的实际函数了,只要指针本身是正确的(指向子类或者基类,而不
是强制转成乱七八糟的指针)。总的来说编译器负责产生下标,而对象负责提供一个虚
函数表。理解这个以后其实c++的多态很容易理解,就是一个普通的共享函数指针数组。
上面那个问题的答案就是这个指针赋值只管指针变量本身赋值(4字节或者8字节),和
其他任何普通类型的赋值没有区别。实际指向的内存块的内容没有任何改变,而内存块
的开始就是这个对象虚函数表的指针。
avatar
a*m
95
找最大的是用一个变量保存然后扫描一下就可以了吧。找两个是用两个变量保存。。。。

【在 A**u 的大作中提到】
: 同时找到 最大 和 第二大
: 3n/2 怎么来的

avatar
A*u
96
负责任地告诉你
这需要2N次

。。

【在 a********m 的大作中提到】
: 找最大的是用一个变量保存然后扫描一下就可以了吧。找两个是用两个变量保存。。。。
avatar
A*u
97
明白了
辛苦了,码了这么多字

【在 a********m 的大作中提到】
: 简单说几句。板上大牛多,俺板门弄斧下,再说大牛们估计也觉得说这个太简单了。如
: 果有错误请指出。谢先。另外俺用c/c++的前几年也不是很理解很多细节,只管记语法
: ,或者有些理解错误,所以刚开始用c++的童鞋不清楚这个的话也是正常的。
: 首先要知道c++对象和structure除了缺省private以外没有区别。都是一堆成员变量组
: 成一个内存块。
: 但是如果类有一个虚函数以后每个对象会在开头多一个指针变量。现在的机器和编译器
: 一般来说是4个字节。这个指针指向这个类的虚函数表,而且所有的同类对象的指针都
: 指向同一个表。虚函数调用是先去这个表查询一下(编译器会分配一个下标),调用函
: 数实际类似 _vtable[下标](.....),其中_vtable 相当于(*(void*)pobj).
: 编译器编译虚函数的时候不是生成函数跳转,而是生成一个下标。对于同一个函数,基

avatar
a*m
98
恩。这样的话最坏是2n。

【在 A**u 的大作中提到】
: 负责任地告诉你
: 这需要2N次
:
: 。。

avatar
k*n
99
每两个比较,把大的换到前面,n/2次
n/2个里面挑最大的,n/2次
剩下的n/2-1再加上刚才最大的配对的那个里面挑最大的,又是n/2次

。。

【在 a********m 的大作中提到】
: 找最大的是用一个变量保存然后扫描一下就可以了吧。找两个是用两个变量保存。。。。
avatar
a*m
100
赞。

【在 k****n 的大作中提到】
: 每两个比较,把大的换到前面,n/2次
: n/2个里面挑最大的,n/2次
: 剩下的n/2-1再加上刚才最大的配对的那个里面挑最大的,又是n/2次
:
: 。。

avatar
j*p
101
哈哈 我就是这么答得 结果他说 swap的次数也要最少!然后就又在这里纠缠了20多分
钟。。。

【在 k****n 的大作中提到】
: 每两个比较,把大的换到前面,n/2次
: n/2个里面挑最大的,n/2次
: 剩下的n/2-1再加上刚才最大的配对的那个里面挑最大的,又是n/2次
:
: 。。

avatar
j*p
102
还是不明白。。。 能不能按我的思路 回答一下下面的问题啊
还是上面的例子
(1) 用 Base* pb = dynamic_cast(pd); 和 Base* pb = pd; 效果 一样吗
(我觉得不一样吧)
(2) 如果不一样,如果用 Base* pb = dynamic_cast(pd); 之后, 调用(*pb
)::v() 是调用 Base::v() 的话,这个是怎么实现的呢?(pb 就不能指到D上了 否则就
调用D里面的 Derived::v()了)
Thanks!:)

【在 a********m 的大作中提到】
: 简单说几句。板上大牛多,俺板门弄斧下,再说大牛们估计也觉得说这个太简单了。如
: 果有错误请指出。谢先。另外俺用c/c++的前几年也不是很理解很多细节,只管记语法
: ,或者有些理解错误,所以刚开始用c++的童鞋不清楚这个的话也是正常的。
: 首先要知道c++对象和structure除了缺省private以外没有区别。都是一堆成员变量组
: 成一个内存块。
: 但是如果类有一个虚函数以后每个对象会在开头多一个指针变量。现在的机器和编译器
: 一般来说是4个字节。这个指针指向这个类的虚函数表,而且所有的同类对象的指针都
: 指向同一个表。虚函数调用是先去这个表查询一下(编译器会分配一个下标),调用函
: 数实际类似 _vtable[下标](.....),其中_vtable 相当于(*(void*)pobj).
: 编译器编译虚函数的时候不是生成函数跳转,而是生成一个下标。对于同一个函数,基

avatar
j*p
103
不好意思 当时我理解是in place 后来他说可以开几个内存,不过和数组长度无关
我先不post答案了

【在 k****n 的大作中提到】
: 每两个比较,把大的换到前面,n/2次
: n/2个里面挑最大的,n/2次
: 剩下的n/2-1再加上刚才最大的配对的那个里面挑最大的,又是n/2次
:
: 。。

avatar
a*m
104
1. 结果没区别。不确定编译器会不会先查一下类信息。最后反正是指向同一个内存地
址。反过来pb->pd的时候编译器会运行时查类信息,看是不是合法cast再决定结果。
2. 如果v是虚函数,就调用pd版本。如果是普通函数,调用地址是根据当前类决定的,
调用pb版本。


pb

【在 j*p 的大作中提到】
: 还是不明白。。。 能不能按我的思路 回答一下下面的问题啊
: 还是上面的例子
: (1) 用 Base* pb = dynamic_cast(pd); 和 Base* pb = pd; 效果 一样吗
: (我觉得不一样吧)
: (2) 如果不一样,如果用 Base* pb = dynamic_cast(pd); 之后, 调用(*pb
: )::v() 是调用 Base::v() 的话,这个是怎么实现的呢?(pb 就不能指到D上了 否则就
: 调用D里面的 Derived::v()了)
: Thanks!:)

avatar
A*u
105
他要你写代码了吗
递归算不算 in place?

【在 j*p 的大作中提到】
: 哈哈 我就是这么答得 结果他说 swap的次数也要最少!然后就又在这里纠缠了20多分
: 钟。。。

avatar
w*x
106
3n/2的基本思想是这样的:
一开始有两个数, 知道最大的和第二大的
对第3个比较的第二大的数, 比较一次后可得两个数, 不知道谁最大谁最小
对第四个数分别比较这不知道位置的两个数, 比较两次得出谁最大谁最小
第5个数情况和第3个相同...
就是比较次数: 1, 2, 1, 2, 1, 2, 1, 2 ... 就是3n/2了
自己想出来的, wa ka ka
avatar
j*p
107

所以dynamic_cast只是负责检查了一下类型 没有其他作用。。。 我还以为这个东西有
多牛呢。怪不得被印度人鄙视了,sigh~
btw,刚才又查了一下primer,从base类到derived类要用static_cast,dynamic_cast会返
回空指针
thanks for answers!

【在 a********m 的大作中提到】
: 1. 结果没区别。不确定编译器会不会先查一下类信息。最后反正是指向同一个内存地
: 址。反过来pb->pd的时候编译器会运行时查类信息,看是不是合法cast再决定结果。
: 2. 如果v是虚函数,就调用pd版本。如果是普通函数,调用地址是根据当前类决定的,
: 调用pb版本。
:
: 吗
: pb

avatar
j*p
108

两次就够了?

【在 w****x 的大作中提到】
: 3n/2的基本思想是这样的:
: 一开始有两个数, 知道最大的和第二大的
: 对第3个比较的第二大的数, 比较一次后可得两个数, 不知道谁最大谁最小
: 对第四个数分别比较这不知道位置的两个数, 比较两次得出谁最大谁最小
: 第5个数情况和第3个相同...
: 就是比较次数: 1, 2, 1, 2, 1, 2, 1, 2 ... 就是3n/2了
: 自己想出来的, wa ka ka

avatar
j*p
109
递归要看是不是in place的递归啊
反正 如果完全in place的话 那个两两一组的方法应该最好了 加上递归效果一样 也是
3n/2 加上很多swap
你慢慢想 我睡觉去了 :)

【在 A**u 的大作中提到】
: 他要你写代码了吗
: 递归算不算 in place?

avatar
a*m
110
dynamic会根据RTTI检查合法性,也看你的编译选项。这个是基本知识,不高级,但是
这个cast还是做了一些事情的。
如果你的dynamic cast返回null说明你的cast有问题。static强制过去了虽然成功了但
是实际是错的。不是说“要用static_cast”。

【在 j*p 的大作中提到】
: 递归要看是不是in place的递归啊
: 反正 如果完全in place的话 那个两两一组的方法应该最好了 加上递归效果一样 也是
: 3n/2 加上很多swap
: 你慢慢想 我睡觉去了 :)

avatar
r*t
111
啥时候 cast 会 copy, or ever change at all?

【在 j*p 的大作中提到】
: 刚才我想了一下,当时是说vtable的时候引出来的 他问的意思应该是 在进行类型转换
: 之后vtable怎么变化 比如
: class Base
: {
: public:
: virtual void v();
: }
: class Derived : public Base
: {
: public:

avatar
r*t
112
Base* pb = pd; 能编译得过么?

【在 a********m 的大作中提到】
: 1. 结果没区别。不确定编译器会不会先查一下类信息。最后反正是指向同一个内存地
: 址。反过来pb->pd的时候编译器会运行时查类信息,看是不是合法cast再决定结果。
: 2. 如果v是虚函数,就调用pd版本。如果是普通函数,调用地址是根据当前类决定的,
: 调用pb版本。
:
: 吗
: pb

avatar
a*2
113
算法导论原题, n+logn-2

【在 j*p 的大作中提到】
: 不好意思 当时我理解是in place 后来他说可以开几个内存,不过和数组长度无关
: 我先不post答案了

avatar
G*e
114
But this is not an in-place algorithm

【在 k****n 的大作中提到】
: 每两个比较,把大的换到前面,n/2次
: n/2个里面挑最大的,n/2次
: 剩下的n/2-1再加上刚才最大的配对的那个里面挑最大的,又是n/2次
:
: 。。

avatar
A*u
115
为啥

【在 G******e 的大作中提到】
: But this is not an in-place algorithm
avatar
G*e
116
Because it needs to swap between elements at positions 2i-1 and 2i during
the first phase.

【在 A**u 的大作中提到】
: 为啥
avatar
G*e
117
This is cute!

【在 w****x 的大作中提到】
: 3n/2的基本思想是这样的:
: 一开始有两个数, 知道最大的和第二大的
: 对第3个比较的第二大的数, 比较一次后可得两个数, 不知道谁最大谁最小
: 对第四个数分别比较这不知道位置的两个数, 比较两次得出谁最大谁最小
: 第5个数情况和第3个相同...
: 就是比较次数: 1, 2, 1, 2, 1, 2, 1, 2 ... 就是3n/2了
: 自己想出来的, wa ka ka

avatar
A*u
118
对不起 我非cs,
请教一下, in place 意思不是不需要开额外内存?
swap 没用内存

【在 G******e 的大作中提到】
: Because it needs to swap between elements at positions 2i-1 and 2i during
: the first phase.

avatar
G*e
119
sorry, you are right. It is in-place. Somehow I had thought the algorithm
should treat the input as read-only:(

【在 A**u 的大作中提到】
: 对不起 我非cs,
: 请教一下, in place 意思不是不需要开额外内存?
: swap 没用内存

avatar
q*x
120
3rd edition, which page?

【在 a**********2 的大作中提到】
: 算法导论原题, n+logn-2
avatar
G*e
121
2nd edition, exercise 9.1-1 (Chapter 9 Medians and Order Statistics, Section
9.1 Minimum and maximum, you probably can find it easily in the 3rd edition
as well).
But I doubt if you can achieve this with an in-place algorithm. For that
exercise you can build a binary tree to get n+logn comparisons but extra
space seems necessary.

【在 q****x 的大作中提到】
: 3rd edition, which page?
avatar
j*p
122
Yes, you're right. :) 当时看primer的时候这个没仔细看 知识点有漏洞啊 :(

【在 a********m 的大作中提到】
: dynamic会根据RTTI检查合法性,也看你的编译选项。这个是基本知识,不高级,但是
: 这个cast还是做了一些事情的。
: 如果你的dynamic cast返回null说明你的cast有问题。static强制过去了虽然成功了但
: 是实际是错的。不是说“要用static_cast”。

avatar
j*p
123
当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
了 f(n)=n/2 + f(n/2) 然后 不知道怎么想的 一直觉得这个得到f(n)=3n/2 :(
刚查了一下 递归公式 f(n)=n/2 + f(n/2) + 1 所以应该是 f(n)= n + log(n) - 2.
这个方法主要问题是要用n/2次swap。那个印度人后来说要minimize swap的次数。我就
很郁闷 因为已经超时了 后来他告我答案了:
不是把数分成n/2组每组两个,要把数分成2组每组n/2个。每组选最大的。比较之后,
较大的就是最大的那个数。较小的和较大的数所在的组里的其他数组成一组,再选最大
的,就得到第二大数了。一共大概3n/2次 用到了一两个额外的内存。
简单吧!:)

【在 a**********2 的大作中提到】
: 算法导论原题, n+logn-2
avatar
a*m
124
? 为啥不能?

【在 r****t 的大作中提到】
: Base* pb = pd; 能编译得过么?
avatar
r*t
125
就是猜,这样初始化是不是该有个 warning 呢?

【在 a********m 的大作中提到】
: ? 为啥不能?
avatar
y*g
126
为什么有warning?subclass的含义是is a

【在 r****t 的大作中提到】
: 就是猜,这样初始化是不是该有个 warning 呢?
avatar
r*t
127
you are totally right.

【在 y*******g 的大作中提到】
: 为什么有warning?subclass的含义是is a
avatar
r*t
128
那一个 pointer 是 Derived* 还是 Base* 对解析被调用的成员函数没有啥影响?
唯一的区别是 Derived* 可以初始化 Based*,
反过来则必须 dynamic_cast (static_cast 合法不?)

【在 a********m 的大作中提到】
: 1. 结果没区别。不确定编译器会不会先查一下类信息。最后反正是指向同一个内存地
: 址。反过来pb->pd的时候编译器会运行时查类信息,看是不是合法cast再决定结果。
: 2. 如果v是虚函数,就调用pd版本。如果是普通函数,调用地址是根据当前类决定的,
: 调用pb版本。
:
: 吗
: pb

avatar
r*t
129
第 4 个数不行的

【在 w****x 的大作中提到】
: 3n/2的基本思想是这样的:
: 一开始有两个数, 知道最大的和第二大的
: 对第3个比较的第二大的数, 比较一次后可得两个数, 不知道谁最大谁最小
: 对第四个数分别比较这不知道位置的两个数, 比较两次得出谁最大谁最小
: 第5个数情况和第3个相同...
: 就是比较次数: 1, 2, 1, 2, 1, 2, 1, 2 ... 就是3n/2了
: 自己想出来的, wa ka ka

avatar
r*t
130
这办法很通用啊。请问算法导论的作者名是啥(离 cs 太远了,表喷饭)?俺想下载学习。

【在 j*p 的大作中提到】
: 当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
: 了 f(n)=n/2 + f(n/2) 然后 不知道怎么想的 一直觉得这个得到f(n)=3n/2 :(
: 刚查了一下 递归公式 f(n)=n/2 + f(n/2) + 1 所以应该是 f(n)= n + log(n) - 2.
: 这个方法主要问题是要用n/2次swap。那个印度人后来说要minimize swap的次数。我就
: 很郁闷 因为已经超时了 后来他告我答案了:
: 不是把数分成n/2组每组两个,要把数分成2组每组n/2个。每组选最大的。比较之后,
: 较大的就是最大的那个数。较小的和较大的数所在的组里的其他数组成一组,再选最大
: 的,就得到第二大数了。一共大概3n/2次 用到了一两个额外的内存。
: 简单吧!:)

avatar
k*n
131
CLRS

习。

【在 r****t 的大作中提到】
: 这办法很通用啊。请问算法导论的作者名是啥(离 cs 太远了,表喷饭)?俺想下载学习。
avatar
a*m
132
区别是base*不能调用derived的成员函数呀。因为这个对象现在是一个base对象。
static是属于强制。你要告诉编译器“不要管我,把类型改了就成了”

【在 r****t 的大作中提到】
: 那一个 pointer 是 Derived* 还是 Base* 对解析被调用的成员函数没有啥影响?
: 唯一的区别是 Derived* 可以初始化 Based*,
: 反过来则必须 dynamic_cast (static_cast 合法不?)

avatar
r*t
133
喔对了,把最基本的忘了,惨了惨了。

【在 a********m 的大作中提到】
: 区别是base*不能调用derived的成员函数呀。因为这个对象现在是一个base对象。
: static是属于强制。你要告诉编译器“不要管我,把类型改了就成了”

avatar
r*t
134
谢了,找了个第二版。要是学算法的话, CLRS 和 Kleinberg & Tardos 之间如何比较
?我有后者的纸书,两个都是大部头,想 focus 一个。

【在 k****n 的大作中提到】
: CLRS
:
: 习。

avatar
k*n
135
后者我不知道,CLRS是绝对够用了,对于算法和数据结构基础入门来说

【在 r****t 的大作中提到】
: 谢了,找了个第二版。要是学算法的话, CLRS 和 Kleinberg & Tardos 之间如何比较
: ?我有后者的纸书,两个都是大部头,想 focus 一个。

avatar
r*t
136
谢谢!

【在 k****n 的大作中提到】
: 后者我不知道,CLRS是绝对够用了,对于算法和数据结构基础入门来说
avatar
A*u
137
不好...

【在 j*p 的大作中提到】
: 当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
: 了 f(n)=n/2 + f(n/2) 然后 不知道怎么想的 一直觉得这个得到f(n)=3n/2 :(
: 刚查了一下 递归公式 f(n)=n/2 + f(n/2) + 1 所以应该是 f(n)= n + log(n) - 2.
: 这个方法主要问题是要用n/2次swap。那个印度人后来说要minimize swap的次数。我就
: 很郁闷 因为已经超时了 后来他告我答案了:
: 不是把数分成n/2组每组两个,要把数分成2组每组n/2个。每组选最大的。比较之后,
: 较大的就是最大的那个数。较小的和较大的数所在的组里的其他数组成一组,再选最大
: 的,就得到第二大数了。一共大概3n/2次 用到了一两个额外的内存。
: 简单吧!:)

avatar
a*2
138
选出了最大的那个数以后,较小的数不需要跟较大数理的每个数进行比较,只需要跟那些
跟最大数比较过的数进行比较,所以
是logn 而不是n/2

【在 j*p 的大作中提到】
: 当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
: 了 f(n)=n/2 + f(n/2) 然后 不知道怎么想的 一直觉得这个得到f(n)=3n/2 :(
: 刚查了一下 递归公式 f(n)=n/2 + f(n/2) + 1 所以应该是 f(n)= n + log(n) - 2.
: 这个方法主要问题是要用n/2次swap。那个印度人后来说要minimize swap的次数。我就
: 很郁闷 因为已经超时了 后来他告我答案了:
: 不是把数分成n/2组每组两个,要把数分成2组每组n/2个。每组选最大的。比较之后,
: 较大的就是最大的那个数。较小的和较大的数所在的组里的其他数组成一组,再选最大
: 的,就得到第二大数了。一共大概3n/2次 用到了一两个额外的内存。
: 简单吧!:)

avatar
g*i
139
winner tree

【在 a**********2 的大作中提到】
: 选出了最大的那个数以后,较小的数不需要跟较大数理的每个数进行比较,只需要跟那些
: 跟最大数比较过的数进行比较,所以
: 是logn 而不是n/2

avatar
q*x
140
要求O(1) space的话,怎么记住哪些数和最大数比较过?

【在 a**********2 的大作中提到】
: 选出了最大的那个数以后,较小的数不需要跟较大数理的每个数进行比较,只需要跟那些
: 跟最大数比较过的数进行比较,所以
: 是logn 而不是n/2

avatar
A*u
141
no in place

【在 g*****i 的大作中提到】
: winner tree
avatar
C*U
142
i told them at beginning, no body noticed>\?

【在 a**********2 的大作中提到】
: 算法导论原题, n+logn-2
avatar
z*t
143
题目“找出两个数之和是那个给定值的所有组合”可以参考
http://codercareer.blogspot.com/2011/10/no-09-numbers-with-give
这个博客的解法需要先排序数组。如果数组是无序的,排序先。

【在 j*p 的大作中提到】
: 电面一个trading system developer的职位 印度人电面 本人不是计算机专业的
: 先问了一个brainteaser (一个unfair硬币做出fair的选择,这个过程结束时投硬币次
: 数的期望) 和c++的基本知识 比如stucture和class的区别 还有vtable怎么实现的
: 然后问一个derived类的指针cast到一个base类的指针是怎么实现的 从base类的指针到
: derived类的指针 我从头到尾就没明白问的是啥 他大概说 那个指针是直接用还是要
: copy一份再用或者什么的
: 我当时不记得cast的东西了 就跟他说 我只记得有四种cast类型 他说这是dynamic_
: cast 怎么实现 然后就在这里纠缠了很久 我最后说 我对这个不了解 他问 你是面啥职
: 位啊 我说developer啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

avatar
a*d
144
From autumnworm,叙事清楚,学习了。
另外求第二大的那个好像是quickselect的
n/2+n/4+n/8........直到(n==2||n==3)?
avatar
a*d
145
From autumnworm,叙事清楚,学习了。
另外求第二大的那个好像是quickselect的
n/2+n/4+n/8........直到(n==2||n==3)?
avatar
s*n
146
good one

【在 j*p 的大作中提到】
: 当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
: 了 f(n)=n/2 + f(n/2) 然后 不知道怎么想的 一直觉得这个得到f(n)=3n/2 :(
: 刚查了一下 递归公式 f(n)=n/2 + f(n/2) + 1 所以应该是 f(n)= n + log(n) - 2.
: 这个方法主要问题是要用n/2次swap。那个印度人后来说要minimize swap的次数。我就
: 很郁闷 因为已经超时了 后来他告我答案了:
: 不是把数分成n/2组每组两个,要把数分成2组每组n/2个。每组选最大的。比较之后,
: 较大的就是最大的那个数。较小的和较大的数所在的组里的其他数组成一组,再选最大
: 的,就得到第二大数了。一共大概3n/2次 用到了一两个额外的内存。
: 简单吧!:)

avatar
c*p
147
一个稍微复杂一点的解法:
iterate over array with step = 2;
{
first, compare the a[i], a[i+1];
second, compare the first_max_so_far with max of a[i], a[i+1] to get new
first_max_so_far;
third, based on comparison result from second step, we can get the second_
max_so_far by
compare (first_max_so_far, min) or (second_max_so_far, max)
}
returns second_max_so_far;
complexity:
for every two elements in the array, at most three comparisons. So total
complexity is (n/2) * 3.
And no swap needed.


【在 j*p 的大作中提到】
: 当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
: 了 f(n)=n/2 + f(n/2) 然后 不知道怎么想的 一直觉得这个得到f(n)=3n/2 :(
: 刚查了一下 递归公式 f(n)=n/2 + f(n/2) + 1 所以应该是 f(n)= n + log(n) - 2.
: 这个方法主要问题是要用n/2次swap。那个印度人后来说要minimize swap的次数。我就
: 很郁闷 因为已经超时了 后来他告我答案了:
: 不是把数分成n/2组每组两个,要把数分成2组每组n/2个。每组选最大的。比较之后,
: 较大的就是最大的那个数。较小的和较大的数所在的组里的其他数组成一组,再选最大
: 的,就得到第二大数了。一共大概3n/2次 用到了一两个额外的内存。
: 简单吧!:)

avatar
a*8
148
static int secondMax(int[] array) {
if(array == null || array.length < 2)
throw new RuntimeException("Invalid input");

int max = Integer.MIN_VALUE;
int secondMax = Integer.MIN_VALUE;
for(int i = 1; i < array.length; i = i + 2) {
int tempMax, tempMin;
if(array[i - 1] > array[i]) {
tempMax = array[i - 1];
tempMin = array[i];
} else {
tempMax = array[i];
tempMin = array[i - 1];
}

if(tempMax > max) {
if(tempMin > max)
secondMax = tempMin;
else
secondMax = max;

max = tempMax;
} else {
if(tempMax > secondMax)
secondMax = tempMax;
}
}

if(array.length % 2 != 0) {
int last = array[array.length - 1];
if(last > max) {
secondMax = max;
max = last;
} else {
if(last > secondMax)
secondMax = last;
}
}

return secondMax;
}
avatar
c*e
149
面试过一个,问i=1;i++;i=?,结果说不知道。
现在很多程序员只不过是google & copy & paste

【在 a********m 的大作中提到】
: 想想也不是基本概念。不过是所有c++程序员应该清楚的。
: 就好像一个带虚函数的类和一个不带的,其他都完全一样,只有一个函数声明不同。这
: 两个类的sizeof()值有什么区别。

avatar
c*e
150
不会吧,不是CS的都知道啊。我知道有人提问i++是每次加几,呵呵

【在 c*****e 的大作中提到】
: 面试过一个,问i=1;i++;i=?,结果说不知道。
: 现在很多程序员只不过是google & copy & paste

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。