zoukankan      html  css  js  c++  java
  • 《程序猿面试宝典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就可以。

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


  • 相关阅读:
    linux系统中如何查看日志 (转)
    php 获取随机字符串(原创)
    php Aes 128位算法
    linux 在线实验
    number随时间随机递增每天 不同 php(原创)
    php 判断字符串包含中文(转)
    同步,异步 阻塞,非阻塞, 异步+回调机制 线程队列 事件Event 丶协程
    线程的理论知识 开启线程的两种方式(Thread) 线程和进程之间的对比 线程的其他方法 守护进程 互斥锁 死锁现象,递归锁 信号量
    获取进程以及父进程的pid 验证进程之间的数据隔离 join方法 进程对象的其他属性 僵尸进程与孤儿进程(存在Linux系统中) 守护进程
    进程基础知识 操作系统 操作系统的发展史(多道技术) 进程介绍 python并发编程之:多进程
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6800059.html
Copyright © 2011-2022 走看看