《程序猿面试宝典3》大量错误(50+)纠正表

《程序猿面试宝典》第3版大量错误纠正表

       曾经随手翻了翻,想写这篇文章没有写,如今完整看了下就记录下来了。

找工作的同学大部分都会看《程序猿面试宝典》,本来看过去就能够了。

但我还是要把自己记录的大量错误指出来,以免误人子弟。

这本书错误漏洞百出。编辑质量太差。

尽管它一版再版,一再流传,却没有一个勘误表,错误改了非常多。还有非常多依旧存在。

       因此提醒读者一定要自己动脑筋。否则非常多错误的表述和观念植根于你的脑海,可能引起非常严重的后果。并且,这本书功利性太强。属于快餐式知识,浮于表面,对自己的思想和观念都可能造成错觉。比如说序言,没错,是序言,涉世不深的朋友可能没看出玄机,没看出一个华丽的营销。你把序言翻到第二页,会看到一个偌大的签名。紧跟着偌大的MicroSoft的标记。以及一长串的签名和职位,没错,几乎相同一页了。这一大堆职位可能会给涉世不深的朋友非常多错觉,正如“我在加州理工学院读书。然后获博士学位”仅仅指就在加州转了一圈,然后在野鸡大学拿了个博士文凭一样。

       当然。我不否认这本书的意义。它蜻蜓点水式地浏览了一以下试可能遇到的问题。能够帮助回想自己须要掌握哪些知识。

所以,以下把自己随手记录的50个左右的错误列出来,仅供大家參考。另一些没有发现或者没有考虑或者懒得写出来,欢迎补充和交流。

C/C++程序设计部分

这部分主要是语言概念的理解、细节、常见应用和一些经验技巧。

P38,5.5节 面试例题1

       解析过程表达和逻辑错误。没有说明结果是250的真正原因。“最后的结果应该是2。但在vs2008结果居然是250”说法牵强无逻辑,不论什么一个C++的程序的结果是理论上就确定的(包含没有定义也是一种答案,由编译器实现也是一种确切的回答。比方局部变量int i没有初始化,那么它的值是没有定义的。不会由于编译器是什么就是什么;比方 sizeof(int)的大小是由编译器和机器决定的,不能说由于编译结果是4就是4),不会由于编译器如何就是什么结果;假设语言没定义就叫没定义,假设由编译器实现就是编译器实现而定,不会说由于编译器的结果是如何的,就该是如何的。C/C++语言本身是自完备的、自兼容的、自表达的。

       本题是这样的,~a操作时。会对a进行整型提升,a是无符号的,提升时左边补0(一般机器32位,char是8位。左边24个1;16位int则左边补8个0)。取反后左边为1。右移就把左边的1都移到右边(注意是算术移位),再依照无符号读取,才有250这个结果。

P39,5.5节 面试例题3

       “这个的结果是x和y同样位的一半”。结果是同样位,也就是同样位的和的一半。

P40,5.6节 面试例题1

       方案一中,a-b可能溢出,这个应该须要提出,方案二同样,假设考虑溢出该怎么做?能够做相关推断,或者考虑位运算结合布尔逻辑数学公式、布电这类的方法。

P41,5.7节 面试例题2

       “头文件ifndef/define/endif干什么用的”,准确的说,它是条件编译的一种。除了头文件被防止反复引用(总体)。还能够防止反复定义(变量、宏或者结构)。

P43,5.8节 面试例题

       去掉C/C++里的凝视。1)单引號里有凝视的情况是不可能的,当然这个对结果没影响。2)程序仅仅考虑了引號前面是的情况,假设是两个,即反斜杠转义了就会出错。3)没有考虑到换行连接符的情况,假设有换行连接符也出错。

P45,6.1节 面试例题1

       宏定义#define FIND(struc,e) (size_t)&((((struc*)0)->e)。后面跟了运算符就会出错的,另外题目的代码太糟糕了。

P47,6.2节 面试例题1

       C语言中。const修饰仅仅读变量,而不是常量,题目解析与C++混淆了。

这是一个概念理解性的错误。

仅仅有enum和#define才定义常量的。

P47,6.2节 面试例题2

       C++不同意没有类型的声明。

P47,6.2节 面试例题3

       并非在const成员函数中用mutable修饰符,是对成员变量用mutable,const成员函数才干够改动。

P48,6.3节 面试例题1

       解析混乱。表达晦涩,一大篇解析没有抓住重点。如“a1、a2、a3是两个字节,结构体对齐參数按默认的8字节对齐。则a1、a2、a3都取2字节对齐”。

应该是VC中,结构体依照当中元素字节数最长的对齐,相邻的元素能够连续放置(假设特殊优化可能调整顺序)。通俗但不完整的说,让每一个元素能够一次读取就可以。但GCC编译器默认都是4字节对齐,并且最大就是4字节的。

P56,6.3节 面试例题7

       1)sizeof(string)没有规定大小的,解析中给出的4是一种实现而已。2)size0f(*p)*2/sizeof(string),这样的代码简单问题复杂化,*p是string类型的。已知了数组大小,并且硬编码到这里了,所以再用数组大小除以单个string大小让人费解。

P59,6.4节 面试例题9

       内联函数由编译器决定是否嵌入的,不是强制性的。主要长处是类型检查和可读性、可调试。重要的一点是仅仅对參数做一次求值,而不像宏替换,这防止宏常出现的多次运算的错误。另外,凝视里的“没有写返回值的”思路混乱。杂糅。不是体现内联与宏的差别。

P61,7.1节 面试例题1

       不是由于要变量不为空就要使用引用。没有这样的因果关系。仅仅是由于引用能够不做检查,更基本的是体如今指向的变量可变不可变和两者含义、作用不同。

P67,7.2节 面试例题3

       char *c不是分配一个全局数组。后面的字符串常量编译时已经分配,c是分配一个指针变量,它在栈上。

P72,7.3节 面试例题1

       Const指针和指向const的指针的差别。

P70,7.2节 面试例题7

       1)“B类的_a把A类的_a覆盖了”这样的说法错误,注意基类与派生类的变量的作用域。

这里能够说隐藏。但不是覆盖。

2)构造B类对象。先调用A的构造函数。所以A类的_a为1,B类的_a为2,没有解析所说的因果关系。

P83,8.2节 面试例题1

       1)代码太混乱,递归还用了2层循环。使用了几乎相同一页2栏的代码。2)解析与代码无关,没有构造多叉树。仅仅是循环比較而已。

3)没实用const,參数太多。

能够參考我的样例。


/***************************************************************
** Contact: 
***************************************************************/
#include <iostream>
#include <vector>
using namespace std;

static vector<int> pos_in_str;
void find_sub_link(const char* p1, const char* p2, int i, int j)
{
	if( !p1[i] || !p2[j] )
		return;
	if( p2[j]==p1[i] && !p2[j+1] ) {
		for(vector<int>::iterator it = pos_in_str.begin(); it != pos_in_str.end(); it++) {
			cout << *it << " ";
		}
		cout << i+1 << endl;
	}
	else if (p2[j] == p1[i]) {
		pos_in_str.push_back(i + 1);
		find_sub_link(p1, p2, i + 1, j + 1);
		pos_in_str.pop_back();
	}
	find_sub_link(p1, p2, i + 1, j);
}
int main(int argc, char **argv)
{
	char str1[10] = "abdbcca";
	char str2[10] = "abc";
	find_sub_link(str1, str2, 0, 0);
	return 0;
}



P85,8.2节 面试例题3

       题目太混乱了,就是计算这个程序供调用多少次x(int n),不是设计算法。

解析中,“单计算x(x(9))当然是9”太敷衍。

P87,8.3节 面试例题2

       int **a=(int*)malloc(N* sizeof(int))混淆了int和int1,尽管结果可能是一样的,但逻辑错误。

sizeof(int)与sizeof(int *)含义不一样的。

P88,8.3节 面试例题3扩展

       所列的算法对结果差点儿无改进,仅仅改成了一半的比較而已。

这题的确须要结合高速排序和二分查找的思路,但能够改变时间复杂度的(给出的算法并没有改变)。

P92,8.5节 面试例题1

       代码中RAND_MAX* RAND_MAX越界了。考虑这个溢出,代码的结果应该是500左右。

P94,9.1节 面试例题1

       文不对题。距离实现vector,这仅仅是使用vector而已。

P96,9.1节 面试例题3

       代码弄了一堆迭代器没实用到,非常多样例这样的情况。比网上拷贝粘贴的代码的排版还乱。

P98,9.2节 面试例题3

       1)T* array须要const,漏掉了。

2)T n。n不是T类型的,应为int。

P105,10.2节 面试例题2

“Test b()是不对的,由于它不须要预先赋值“,什么地方赋值了,什么叫预先赋值。什么叫不须要预先赋值。解析非常让人纠结。

P108,10.3节 面试例题4

A(){const int size = 9;}这个时候,size不是成员变量了,改变了题意。

P115,10.5节 面试例题4

“B选项在gcc測试能够算是一种多态“。这样的表述非常多。模棱两可,说明理解不到位。由于返回类型协变。返回类指针能够不一样的,所以这个就是多态。不叫”算是“。也不是”gcc下算作“。

P120,10.7节 面试例题1

       构造函数x(a,b)应为x(a),y(b)

P122,11.1节 面试例题1測试

/////////////////////////
#include <iostream>
#include <string>
#include <vector>
using namespace std;


class A
{
protected:
    int m_data;
public:
    A(int data=0):m_data(data){}
    //other
    int getData(){return doGetData();}
    virtual int doGetData(){return m_data;}

};

class B:public A
{
protected:
    int m_data;
public:
    B(int data=1):m_data(data){}
    //other
    virtual int doGetData(){return m_data;}
};


class C:public B
{
protected:
    int m_data;
public:
    C(int data=2):m_data(data){}
    //virtual int doGetData(){return m_data;}
};


int main(int argc, char* argv[])
{

    C c(10);
    //B b(20);

    //cout<<b.getData()<<endl;

    cout<<c.doGetData()<<endl;
    cout<<c.getData()<<endl;

    cout<<c.A::getData()<<endl;
    cout<<c.A::doGetData()<<endl;

    cout<<c.B::getData()<<endl;
    cout<<c.B::doGetData()<<endl;

    cout<<c.C::getData()<<endl;
    cout<<c.C::doGetData()<<endl;

    system("pause");
    return 0;


P125,11.2节 面试例题1

       翻译太差,解析了几页没有说清楚。

自己理解意思就可以。

D选项,不能被派生类的子类訪问。

B选项,都能够继承。仅仅是不能訪问。

P130,11.3节 面试例题1

       自己说了不须要链表,还选择B。并且,不是每一个对象都有一个表,多重继承能够多个,在VC里虚继承也有多个。

P131,11.3节 面试例题2

(2)(3)的解析混乱且有错误,尽管答案是那样的。首先,与编译器有关。

其次,解析中。(2)是多了数组和虚类指针,不是多了虚函数表指针。

P135,11.4节 面试例题4

       PB实际的地址是C父类B部分。不是子类。

P144,11.7节 面试例题2

       一大堆无用的描写叙述。没有指出重点。这个题是转换函数的问题。它是一种特殊的运算符重载。特殊的成员函数,无返回类型。无參数,一般最好用const修饰。

P135,11.4节 面试例题4


数据结构与算法部分。差点儿全部代码都没有认真编辑、校验和核对。排版及其混乱,变量名、函数名非常山寨,程序逻辑漏洞百出,无用的代码一大堆。这些低级的我就不一一列举了。几个基本的错误例如以下:

P167,13.1节 面试例题1

       node *create()里malloc了head。没有释放。多余的操作非常多,如while前面的if没用。

P167,13.1节 面试例题2

       P1为NULL没有推断。链表头与链表节点混淆使用。

P167,13.1节 面试例题7

       这部分代码基本都是粗制滥造,大量无关代码,NULL推断不足,变量未使用。未释放malloc的空间。

P224,14.3节 面试例题3

       第257个char才是ch,解析错误。

结果与256、257之类的没关系。

由于127+1为负数了小于255。所以一直循环。

不是什么改变256个char的值。

P225,14.4节 面试例题2

       B显然错误,C中即使加了const也不行。题目是要求C语言中。

仅仅有C++才干够。

P226,14.5节 面试例题2

       程序输出的是所以反复出现的而不是长度最长的。这样的错误非常多。

P228,14.5节 面试例题5

       代码居然写了一页半。

能够參考一下我的代码。当然也不一定非常好,欢迎指正

/***************************************************************
** Contact:
***************************************************************/
#include <stdio.h>
unsigned long f(unsigned long n){
	unsigned long fn = 0, ntemp = n;
	unsigned long step;
	for(step = 1; ntemp > 0; step *= 10, ntemp /= 10){
		fn += (((ntemp -1 ) /10) + 1) * step;
		if(( ntemp % 10 ) ==1){
			fn -= step - (n % step + 1);
		}
	}
	return fn;
}
unsigned long get_max_fn_equal_n(unsigned long upper_bound){
	unsigned long n = 1, fn = 0;
	unsigned long max = 1;
	while(n <= upper_bound ) {
		fn = f(n);
		if(fn == n){
			max = n;
			printf("%10lu	" , n++);
		}
		else if( fn < n )
			n += (n-fn)/10 + 1;
		else 
			n = fn; 
	}
	return max;
}
int main()
{
	unsigned long upper_bound = 4000000000UL;
	printf("[::test] f(%lu) = %lu.
", 13, f(13));
	printf("
[::max] max({f(n)=n, n<=%lu}) = %lu.
", upper_bound, get_max_fn_equal_n(upper_bound));
	return 0;
}



P230,14.6节 面试例题

       1)strlen(reschar)并非当前字符串长度,由于仅仅有rescahr[0]置为’’。后面的并没有清空。所以代码的结果未知。能够使用memset清空。

2)题中代码使用了C++,所以使用cou就可以,解答大量混淆C与C++代码。风格非常差。并不像题目所说,用sprintf才行。3)if str[k]=str[k+1]count++;错误,这一部分不须要,仅仅须要循环到len-2就可以。

       还有非常多就不提了,这是一本营销出来的书,自己多思考多实践会有一些用。假设死记这本书的一些观点和解析仅仅会有害无益。这里把错误列出来也是给大家參考,可能还有我没有发现的或者没有其他观点,欢迎补充。


原文地址:https://www.cnblogs.com/cynchanpin/p/6800059.html