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();
|
|
|
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). : 编译器编译虚函数的时候不是生成函数跳转,而是生成一个下标。对于同一个函数,基
|
|
|
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
|
|
|
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”。
|
|
|
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 合法不?)
|
|
|
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
|
|
|
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啊 然后 他就问其他题了 当时郁闷死了 : 之后就是两代算法题 一道是给一组数和一个给定值 找出两个数之和是那个给定值的所
|
|
|
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). : 编译器编译虚函数的时候不是生成函数跳转,而是生成一个下标。对于同一个函数,基
|
|
|
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
|
|
|
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
|
|
|
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
|
|
|
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次 用到了一两个额外的内存。 : 简单吧!:)
|
|
|
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次 用到了一两个额外的内存。 : 简单吧!:)
|
|
|
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
|