由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 请问这是什么level的面试题
相关主题
one C++ question?好心人帮忙推荐一本C++入门书
virtual destructor (C++)问题NeAp 面试题一道
微软C++面试题Nvidia 3rd phone interview and Amazon offer
问个硬件加OO的面试题LC有序数组删重复元素的题怎么最快?
元旦节来一道题目吧(update:贴答案了)问一道题
白痴问题:TreeNode 里面有指向 parent 的指针么?下午的google就只code完一题,没来得及做第二题
hash table 的entry里存的是内容还是指针?CLRS的算法书
吐槽QuickSort的partition数组里找第二大的数
相关话题的讨论汇总
话题: base话题: derived话题: cast话题: secondmax话题: 指针
进入JobHunting版参与讨论
1 (共1页)
j*p
发帖数: 115
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是怎么弄得。这种题对于计算
机系的人算容易题吗?有人能猜出来他要问什么吗?:(
a********m
发帖数: 15480
2
这是最基本的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啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

q****x
发帖数: 7404
3
啥公司?

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

y*******g
发帖数: 6599
4
对cs来说是基础题目

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

C***U
发帖数: 2406
5
你说的找第二大的数字那个 是CRLS后面的一道练习题 好像是

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

j*p
发帖数: 115
6
刚才我想了一下,当时是说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.
a********m
发帖数: 15480
7
vtable当然不变,不然怎么知道如何调用正确的虚函数。而且所有同类对象都用同一个
vtable。
这个是c++基本概念,应该搞清楚的。不是是否经常用cast的问题。

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

a********m
发帖数: 15480
8
想想也不是基本概念。不过是所有c++程序员应该清楚的。
就好像一个带虚函数的类和一个不带的,其他都完全一样,只有一个函数声明不同。这
两个类的sizeof()值有什么区别。
j*p
发帖数: 115
9
麻烦你在解释一下吧 还是不懂 还是这个例子
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的问题。

A**u
发帖数: 2458
10
借这位的问题我也问问
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();

相关主题
白痴问题:TreeNode 里面有指向 parent 的指针么?好心人帮忙推荐一本C++入门书
hash table 的entry里存的是内容还是指针?NeAp 面试题一道
吐槽QuickSort的partitionNvidia 3rd phone interview and Amazon offer
进入JobHunting版参与讨论
A**u
发帖数: 2458
11
同时找到 最大 和 第二大
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啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

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

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

A**u
发帖数: 2458
14
负责任地告诉你
这需要2N次

。。

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

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

a********m
发帖数: 15480
16
恩。这样的话最坏是2n。

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

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

。。

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

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

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

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

j*p
发帖数: 115
20
还是不明白。。。 能不能按我的思路 回答一下下面的问题啊
还是上面的例子
(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).
: 编译器编译虚函数的时候不是生成函数跳转,而是生成一个下标。对于同一个函数,基

相关主题
LC有序数组删重复元素的题怎么最快?CLRS的算法书
问一道题数组里找第二大的数
下午的google就只code完一题,没来得及做第二题发个新的GG电面面经并求解答~~~
进入JobHunting版参与讨论
j*p
发帖数: 115
21
不好意思 当时我理解是in place 后来他说可以开几个内存,不过和数组长度无关
我先不post答案了

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

a********m
发帖数: 15480
22
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!:)

A**u
发帖数: 2458
23
他要你写代码了吗
递归算不算 in place?

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

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

所以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

j*p
发帖数: 115
26

两次就够了?

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

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

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

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

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

r****t
发帖数: 10904
29
啥时候 cast 会 copy, or ever change at all?

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

r****t
发帖数: 10904
30
Base* pb = pd; 能编译得过么?

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

相关主题
包子呼唤大牛--问关于C++Destructor的问题 (转载)virtual destructor (C++)问题
C++ Q22: ostream微软C++面试题
one C++ question?问个硬件加OO的面试题
进入JobHunting版参与讨论
a**********2
发帖数: 340
31
算法导论原题, n+logn-2

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

G******e
发帖数: 229
32
But this is not an in-place algorithm

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

A**u
发帖数: 2458
33
为啥

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

【在 A**u 的大作中提到】
: 为啥
G******e
发帖数: 229
35
This is cute!

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

A**u
发帖数: 2458
36
对不起 我非cs,
请教一下, in place 意思不是不需要开额外内存?
swap 没用内存

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

G******e
发帖数: 229
37
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 没用内存

q****x
发帖数: 7404
38
3rd edition, which page?

【在 a**********2 的大作中提到】
: 算法导论原题, n+logn-2
G******e
发帖数: 229
39
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?
j*p
发帖数: 115
40
Yes, you're right. :) 当时看primer的时候这个没仔细看 知识点有漏洞啊 :(

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

相关主题
问个硬件加OO的面试题hash table 的entry里存的是内容还是指针?
元旦节来一道题目吧(update:贴答案了)吐槽QuickSort的partition
白痴问题:TreeNode 里面有指向 parent 的指针么?好心人帮忙推荐一本C++入门书
进入JobHunting版参与讨论
j*p
发帖数: 115
41
当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
了 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
a********m
发帖数: 15480
42
? 为啥不能?

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

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

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

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

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

r****t
发帖数: 10904
47
第 4 个数不行的

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

r****t
发帖数: 10904
48
这办法很通用啊。请问算法导论的作者名是啥(离 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次 用到了一两个额外的内存。
: 简单吧!:)

k****n
发帖数: 369
49
CLRS

习。

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

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

相关主题
NeAp 面试题一道问一道题
Nvidia 3rd phone interview and Amazon offer下午的google就只code完一题,没来得及做第二题
LC有序数组删重复元素的题怎么最快?CLRS的算法书
进入JobHunting版参与讨论
r****t
发帖数: 10904
51
喔对了,把最基本的忘了,惨了惨了。

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

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

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

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

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

r****t
发帖数: 10904
54
谢谢!

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

【在 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次 用到了一两个额外的内存。
: 简单吧!:)

a**********2
发帖数: 340
56
选出了最大的那个数以后,较小的数不需要跟较大数理的每个数进行比较,只需要跟那些
跟最大数比较过的数进行比较,所以
是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次 用到了一两个额外的内存。
: 简单吧!:)

g*****i
发帖数: 2162
57
winner tree

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

q****x
发帖数: 7404
58
要求O(1) space的话,怎么记住哪些数和最大数比较过?

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

A**u
发帖数: 2458
59
no in place

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

【在 a**********2 的大作中提到】
: 算法导论原题, n+logn-2
相关主题
数组里找第二大的数C++ Q22: ostream
发个新的GG电面面经并求解答~~~one C++ question?
包子呼唤大牛--问关于C++Destructor的问题 (转载)virtual destructor (C++)问题
进入JobHunting版参与讨论
z******t
发帖数: 59
61
题目“找出两个数之和是那个给定值的所有组合”可以参考
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啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

a********d
发帖数: 195
62
From autumnworm,叙事清楚,学习了。
另外求第二大的那个好像是quickselect的
n/2+n/4+n/8........直到(n==2||n==3)?
a********d
发帖数: 195
63
From autumnworm,叙事清楚,学习了。
另外求第二大的那个好像是quickselect的
n/2+n/4+n/8........直到(n==2||n==3)?
s******n
发帖数: 3946
64
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次 用到了一两个额外的内存。
: 简单吧!:)

c***p
发帖数: 221
65
一个稍微复杂一点的解法:
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次 用到了一两个额外的内存。
: 简单吧!:)

j*p
发帖数: 115
66
电面一个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是怎么弄得。这种题对于计算
机系的人算容易题吗?有人能猜出来他要问什么吗?:(
a********m
发帖数: 15480
67
这是最基本的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啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

q****x
发帖数: 7404
68
啥公司?

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

y*******g
发帖数: 6599
69
对cs来说是基础题目

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

C***U
发帖数: 2406
70
你说的找第二大的数字那个 是CRLS后面的一道练习题 好像是

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

相关主题
virtual destructor (C++)问题元旦节来一道题目吧(update:贴答案了)
微软C++面试题白痴问题:TreeNode 里面有指向 parent 的指针么?
问个硬件加OO的面试题hash table 的entry里存的是内容还是指针?
进入JobHunting版参与讨论
j*p
发帖数: 115
71
刚才我想了一下,当时是说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.
a********m
发帖数: 15480
72
vtable当然不变,不然怎么知道如何调用正确的虚函数。而且所有同类对象都用同一个
vtable。
这个是c++基本概念,应该搞清楚的。不是是否经常用cast的问题。

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

a********m
发帖数: 15480
73
想想也不是基本概念。不过是所有c++程序员应该清楚的。
就好像一个带虚函数的类和一个不带的,其他都完全一样,只有一个函数声明不同。这
两个类的sizeof()值有什么区别。
j*p
发帖数: 115
74
麻烦你在解释一下吧 还是不懂 还是这个例子
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的问题。

A**u
发帖数: 2458
75
借这位的问题我也问问
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();

A**u
发帖数: 2458
76
同时找到 最大 和 第二大
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啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

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

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

A**u
发帖数: 2458
79
负责任地告诉你
这需要2N次

。。

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

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

相关主题
吐槽QuickSort的partitionNvidia 3rd phone interview and Amazon offer
好心人帮忙推荐一本C++入门书LC有序数组删重复元素的题怎么最快?
NeAp 面试题一道问一道题
进入JobHunting版参与讨论
a********m
发帖数: 15480
81
恩。这样的话最坏是2n。

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

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

。。

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

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

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

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

j*p
发帖数: 115
85
还是不明白。。。 能不能按我的思路 回答一下下面的问题啊
还是上面的例子
(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).
: 编译器编译虚函数的时候不是生成函数跳转,而是生成一个下标。对于同一个函数,基

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

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

a********m
发帖数: 15480
87
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!:)

A**u
发帖数: 2458
88
他要你写代码了吗
递归算不算 in place?

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

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

所以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

相关主题
下午的google就只code完一题,没来得及做第二题发个新的GG电面面经并求解答~~~
CLRS的算法书包子呼唤大牛--问关于C++Destructor的问题 (转载)
数组里找第二大的数C++ Q22: ostream
进入JobHunting版参与讨论
j*p
发帖数: 115
91

两次就够了?

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

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

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

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

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

r****t
发帖数: 10904
94
啥时候 cast 会 copy, or ever change at all?

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

r****t
发帖数: 10904
95
Base* pb = pd; 能编译得过么?

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

a**********2
发帖数: 340
96
算法导论原题, n+logn-2

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

G******e
发帖数: 229
97
But this is not an in-place algorithm

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

A**u
发帖数: 2458
98
为啥

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

【在 A**u 的大作中提到】
: 为啥
G******e
发帖数: 229
100
This is cute!

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

相关主题
one C++ question?问个硬件加OO的面试题
virtual destructor (C++)问题元旦节来一道题目吧(update:贴答案了)
微软C++面试题白痴问题:TreeNode 里面有指向 parent 的指针么?
进入JobHunting版参与讨论
A**u
发帖数: 2458
101
对不起 我非cs,
请教一下, in place 意思不是不需要开额外内存?
swap 没用内存

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

G******e
发帖数: 229
102
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 没用内存

q****x
发帖数: 7404
103
3rd edition, which page?

【在 a**********2 的大作中提到】
: 算法导论原题, n+logn-2
G******e
发帖数: 229
104
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?
j*p
发帖数: 115
105
Yes, you're right. :) 当时看primer的时候这个没仔细看 知识点有漏洞啊 :(

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

j*p
发帖数: 115
106
当时 我吭哧半天 也想到了那个两两分组的方法 后来也说可以用递归 连递归公式都说
了 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
a********m
发帖数: 15480
107
? 为啥不能?

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

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

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

【在 y*******g 的大作中提到】
: 为什么有warning?subclass的含义是is a
相关主题
白痴问题:TreeNode 里面有指向 parent 的指针么?好心人帮忙推荐一本C++入门书
hash table 的entry里存的是内容还是指针?NeAp 面试题一道
吐槽QuickSort的partitionNvidia 3rd phone interview and Amazon offer
进入JobHunting版参与讨论
r****t
发帖数: 10904
111
那一个 pointer 是 Derived* 还是 Base* 对解析被调用的成员函数没有啥影响?
唯一的区别是 Derived* 可以初始化 Based*,
反过来则必须 dynamic_cast (static_cast 合法不?)

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

r****t
发帖数: 10904
112
第 4 个数不行的

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

r****t
发帖数: 10904
113
这办法很通用啊。请问算法导论的作者名是啥(离 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次 用到了一两个额外的内存。
: 简单吧!:)

k****n
发帖数: 369
114
CLRS

习。

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

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

r****t
发帖数: 10904
116
喔对了,把最基本的忘了,惨了惨了。

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

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

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

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

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

r****t
发帖数: 10904
119
谢谢!

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

【在 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次 用到了一两个额外的内存。
: 简单吧!:)

相关主题
LC有序数组删重复元素的题怎么最快?CLRS的算法书
问一道题数组里找第二大的数
下午的google就只code完一题,没来得及做第二题发个新的GG电面面经并求解答~~~
进入JobHunting版参与讨论
a**********2
发帖数: 340
121
选出了最大的那个数以后,较小的数不需要跟较大数理的每个数进行比较,只需要跟那些
跟最大数比较过的数进行比较,所以
是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次 用到了一两个额外的内存。
: 简单吧!:)

g*****i
发帖数: 2162
122
winner tree

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

q****x
发帖数: 7404
123
要求O(1) space的话,怎么记住哪些数和最大数比较过?

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

A**u
发帖数: 2458
124
no in place

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

【在 a**********2 的大作中提到】
: 算法导论原题, n+logn-2
z******t
发帖数: 59
126
题目“找出两个数之和是那个给定值的所有组合”可以参考
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啊 然后 他就问其他题了 当时郁闷死了
: 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所

a********d
发帖数: 195
127
From autumnworm,叙事清楚,学习了。
另外求第二大的那个好像是quickselect的
n/2+n/4+n/8........直到(n==2||n==3)?
a********d
发帖数: 195
128
From autumnworm,叙事清楚,学习了。
另外求第二大的那个好像是quickselect的
n/2+n/4+n/8........直到(n==2||n==3)?
s******n
发帖数: 3946
129
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次 用到了一两个额外的内存。
: 简单吧!:)

c***p
发帖数: 221
130
一个稍微复杂一点的解法:
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次 用到了一两个额外的内存。
: 简单吧!:)

相关主题
包子呼唤大牛--问关于C++Destructor的问题 (转载)virtual destructor (C++)问题
C++ Q22: ostream微软C++面试题
one C++ question?问个硬件加OO的面试题
进入JobHunting版参与讨论
a*******8
发帖数: 110
131
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;
}
c*****e
发帖数: 737
132
面试过一个,问i=1;i++;i=?,结果说不知道。
现在很多程序员只不过是google & copy & paste

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

c********e
发帖数: 1209
133
不会吧,不是CS的都知道啊。我知道有人提问i++是每次加几,呵呵

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

1 (共1页)
进入JobHunting版参与讨论
相关主题
数组里找第二大的数元旦节来一道题目吧(update:贴答案了)
发个新的GG电面面经并求解答~~~白痴问题:TreeNode 里面有指向 parent 的指针么?
包子呼唤大牛--问关于C++Destructor的问题 (转载)hash table 的entry里存的是内容还是指针?
C++ Q22: ostream吐槽QuickSort的partition
one C++ question?好心人帮忙推荐一本C++入门书
virtual destructor (C++)问题NeAp 面试题一道
微软C++面试题Nvidia 3rd phone interview and Amazon offer
问个硬件加OO的面试题LC有序数组删重复元素的题怎么最快?
相关话题的讨论汇总
话题: base话题: derived话题: cast话题: secondmax话题: 指针