零散的思绪。另外,推荐《剑指offer》。本文初期大部分思考都从剑指引发。

面试题不单单只是用来面试。其中有很多编程的经验可以学习。就如同我们当年的考试:)

1:鲁棒性的一个方面:边界条件和异常处理。

  1,鲁棒性:robust的中文音译。本身就是健全性。

  2,面试中,经常出现一些简单的代码。考验的就是一个程序员对边界条件和异常处理的考虑。

    例如:字符串转化为整数。本身题目非常简单。但,我们应该能够考虑到异常输入有:英文/未知符号,负数,空指针,超大数值。

    另外,需要明确题目。如果面试官的要求是:字符串转化为数字。需要问清楚,整数,还是浮点?。。。当然,也可能弄巧成拙,本来面试官只是想整数,但你既然问了,那就成全你吧:(

    如果是浮点,我们可能还要考虑,精度缺失的问题。我们就要考虑double的精度。

  3,对于链表,边界中最不容易考虑的应该是:链表项数。

    例如:查找倒数K项,但实际链表项数 < K。

2:对数组操作的一些胡思乱想。

  1,C++数组最麻烦的一点是下标超出。我们当然可以用vector解决。但面试中,常常用这种事情来玩你。。。

  2,我对数组的遍历,经常是for循环+数组个数。数组各数通常使用宏定义。但,这并不能解决超出问题。比如:把14打成15这种低级错误。所以,是否能够有使用一种方式解决此问题?下面是我对此想法的一个尝试。

/**********************************************************
* \file array_t.cpp
* \brief
* \note
*
* \version
* \author zheng39562@163.com
***********************************************************/
#include <iostream> using namespace std; int main( int argc, char **argv )
{
int array[] = { , , , , }; int iNumOfarray = sizeof( array ) / sizeof( array[] );
cout << iNumOfarray << endl;
for( int i=; i<iNumOfarray; i++)
{
cout << array[i] << endl;
}
}

    1)此代码中,尝试用sizeof来解决循环问题。但我无法确定,此方法是否会有其他瑕疵。

    2)当然,更好的方法是使用vector。此代码仅是一个简单的讨论性问题。如果有人对此有什么想法。希望能够联系我(评论或邮件)。

    3)另外,此方法不使用将数组指针作为形参的函数,因为通过函数传递的数组,会在函数中自动退化成为普通的指针类型。

3:对于C++常量字符串的一个疑惑。

/**********************************************************
* \file string_t.cpp
* \brief
* \note
*
* \version
* \author zheng39562@163.com
**********************************************************/
#include <iostream>
#include <stdlib.h> using namespace std; int main( int argc, char **argv )
{
char str1[] = "Hello world.";
char str2[] = "Hello world."; char *str3 = {"Hello world."};
char *str4 = {"Hello world."}; if( str1 == str2 )
cout << "1==2" << endl;
else
cout << "1!=2" << endl; if( str3 == str4 )
cout << "3==4" << endl;
else
cout << "3!=4" << endl; exit( );
}

    1)这段代码。最终执行的结果是:1!=2 3==4。剑指(指代剑指offer此书。本文不再重复)中指出,C++在常量字符串上进行了一定优化——str3/4指向同一个地址。我比较好奇的是,C++如何优化此问题。

    2)计算机如何将str3和str4识别成同一个字符串?

    3)此问题,可能涉及到编译,执行和代码内存分配等问题。个人暂时无法解答。留于此,作为记录。

4:对于C++字符串的一些补充。

  1,一个空字符串中依然包含一个'\0'。已经经过代码证实。

5:移动数据的一种方法:当从前往后移动数据,可能需要重复多次时;最好反置进行移动。因为从前往后移动时,很多数据会经历多次向后移动的经历。这点,对于字符串和数组操作尤其有效。

6:对于指针,必须判断其是否为NULL。在剑指中2.3.3链表的添加节点函数中,并没有对指向指针的指针进行判断。也许是因为经验性常识,但我个人认为此代码并不完美。因为指向指针的指针,也同样需要判断。

  1,存在一个疑问:对空指针取地址,得到的结果是否和OS具体实现有关?

7:对于剑指链表的一个另类思路的尝试。

  1,起因:剑指中,尝试使用AddtoTail一个函数完成添加操作。它可以完成添加功能,但同时也完成了链表的创建。代码如下(实现代码省略):

void AddToTail( ListNode** pHead, int value )
{
// contents....
if ( *pHead == NULL )
// contents...
}

    1)使用指向指针的指针的原因是:当往一个空链表中插入头节点时,如果使用链表头作为指针,会导致我们丢失链表头。(具体解释,可以查看剑指offer——或者email本人)

    2)而我的问题是,如果pHead本身就是NULL,这个函数会怎么样?剑指中,对于空指针异常警惕,所以对于此,我存有疑惑。是否是C++语言体系中,已经能够保证NULL指针可以指向NULL?

    3)如果如上猜测,为何在removeNode函数中,又对phead本身进行了判断?

    4)模拟性质的对此函数进行调用,发现似乎需要在外面先创建一个ListNode**的指针。用new?或者还是可以直接NULL。感觉此函数非常模糊不清。如果使用new,感觉多此一举。

  2,对此函数,有两个想法。

 first mode
ListNode* AddToTail( ListNode* pHead, int value ) // 如果传入指针为空,则直接返回一个头指针。使用返回值来获取头指针。
second mode
ListNode* CreateList( int value );
void AddToTail( ListNode* pHead, int value ); // 相信都看的懂 :)
// 个人倾向此方法。虽然使用一个函数解决看起来更简洁。但我更喜欢将行为拆解。

    1)个人无法认同剑指的链表函数,即使NULL真的指向NULL。即使使用该函数不会造成错误——但从逻辑上,很不美好:(

  3,另外,挺喜欢剑指面试4中的环形链表。

8:碰见过的面试中,大部分公司都喜欢考递归。但,需要注意,现实中使用递归需要考虑栈溢出的问题。除非比较确定不会溢出,否则现实中还是少用递归吧。(当然,面试时还是使用递归比较好)

9:面试题6的细节记录:

  1,使用前序和中序数组来构建二叉树。大致思想不再分析,但需要注意异常输入。例如:前序中本身存在错误数据。此时,使用你的函数,是否能够抛出一个错误?

  2,虽然再异常和边界中已经提及其重要性,但个人编程习惯很难一时改变。在面试时,需要可以关注此点。

  3,二叉树是否可以通过前序+后序还原二叉树?(个人已经尝试,无法解决。)

10:注意算法(特别是排序)的额外空间消耗,平均/最差时间复杂度。

  1,基本的数据结构和常用排序算法是必须具备的知识。

11:面试题8代码中,没有考虑数组出错的情况。

  1,对于排序数组的查找和搜索,需要注意重复数字的情况。

12:使用位运算时,需要注意负整数的情况。(通常面试不会变态到求浮点数。)负整数使用补码形式保存数据。

13:很多链表问题都可以使用两个指针解决。。。如果不行,大概可以用3个?(玩笑。。。)

14:面试题28是一个相对复杂的递归方式——因为它的递归出口比较奇怪。

  1,此题思路不难,但递归代码卡了10分钟。因为在大脑中模拟递归走向时出现问题。

  2,使用和理解递归:建议将递归函数代码内的递归函数看成已经解决的结果,而不要尝试展开它。对于部分递归,模拟展开没有问题,但另一部分递归,并不适合展开。

  3,递归有两种模式:

    1)拥有比较简单的出口,并且结果可以带入上层递归函数中。把递归本身当作结果时,很容易联想到结果。对于此类递归,大脑模拟展开问题不大。

    2)如面试28,递归代码中的递归函数本身就代表多种可能性,并且递归出口并非0,1,2,3等等简单解决式。当我尝试大脑模拟打印时,发现可能性多种多样,无法例举。可能反向导致思路受阻。

  4,递归的两个重点:

    1)递归规则。

    2)寻找递归出口。需要注意的是,递归出口有时并非只有一个(虽然一个出口也可以完成递归,但可能会有隐性减分)。

  5,面试28的扩展题。(有时间将重开一章,说明遇见的问题和出现错误)

15:吐槽面试题37.好好的归并排序变种成完全想不到的奇葩题。。。

16:逻辑运算符: '!' 的返回值为TRUE OR FALSE。

17:粗略看完剑指OFFER后的感想。

对于剑指:

阅读完后,第一想法,是将其中的所有面试题进行整理。得到其算法和数据结构的本质。因为面试题可以有各类变种,但需求的算法和数据结构都是不会改变的。阅读剑指,与其说是阅读,理解和记忆面试题,不如说,其总结了常用的面试算法和结构。

18:以下无经过权威证实:

用三天的时间看玩了剑指offer。不得不说,本书写的非常好(听说被翻译成英文出版了。不知真假)。

但剑指中,实际上还有很多很多缺陷的地方。倒不是书的问题。而是知识点实在太多。剑指偏向于算法以及代码细节的处理(如异常等)。但对具体语言就有很大欠缺,需要其他面试题补充。

面试不单是拿OFFER。一个合格的公司,它拿出的面试题本身应该有一定的倾向性。例如,我希望得到服务器相关的岗位。但对于此行业,我只知道非常粗浅的概念知识。解答面试的同时,同样需要关注面试题的中包含的知识倾向。

对面试题(剑指offer)产生的一些思考。的更多相关文章

  1. 剑指Offer面试题:1.实现Singleton模式

    说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...

  2. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  3. 《剑指offer》面试题11: 数值的整数次方

    面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...

  4. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  5. 《剑指Offer》- 面试题3

    <剑指Offer——名企面试官精讲典型编程题>  面试题3:  二维数组元素从左到右.从上到下递增,输入一个二维数组和一个整数,  查找该整数. 自己的思路:有序条件下进行查找,当然最简单 ...

  6. 【剑指Offer学习】【全部面试题汇总】

    剑指Offer学习 剑指Offer这本书已经学习完了.从中也学习到了不少的东西,如今做一个总的文件夹.供自已和大家一起參考.学如逆水行舟.不进则退.仅仅有不断地学习才干跟上时候.跟得上技术的潮流! 全 ...

  7. 【强烈推荐】《剑指Offer:名企面试官精讲典型编程题》一书中IT名企经典面试题

    各位程序猿:         <剑指Offer>一书源自该书作者何海涛坚持更新与编写的博客(http://zhedahht.blog.163.com/),该博客收集整理了大量如微软.Goo ...

  8. 剑指offer编程题Java实现——面试题5从头到尾打印链表

    题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...

  9. 剑指offer编程题Java实现——面试题6重建二叉树

    题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...

随机推荐

  1. requirejs的配置

    baseUrl : 所有模块的查找根路径. 当加载纯.js文件(依赖字串以/开头,或者以.js结尾,或者含有协议),不会使用baseUrl. 如未显式设置baseUrl,则默认值是加载require. ...

  2. Creating a settings table that can handle almost any type of value

    Update: Updated article here. Today I wanted to be able to have a table store any type of value as a ...

  3. 一个好玩的jq+php实现转盘抽奖程序

    前台页面: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <met ...

  4. webview 上 postUrl 发送参数过程中数据丢失或错误 的问题

    用到了android 的 webview 来展示页面.webview需要用post来传递参数.于是问题出现了,后台解析中发现参数错误. 之前有因为String 和byte[]转行时,数据丢失的问题,于 ...

  5. PHP学习路上的一点心得

    继学些了java后,接触php的项目后发现 php真的也是很强大的一门语言,这只是一篇回想,想到什么就写什么把,大家随便看看. 1.php其实无需等待,一般的改完代码后直接刷新页面即可,不需要像jav ...

  6. 阿铭linux笔记

    2015-09-06虚拟机网络设置.wmv: curl     获取在命令行显示的网页 dhclient     分配ip地址 ifdown eth0     关闭网卡eth0 ifup eh0   ...

  7. Scala学习文档-样本类与模式匹配(match,case,Option)

    样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定. //样本类case class //层级包括一个抽象基类Expr和四个子类,每个代表一种表 ...

  8. Linux中C/C++头文件一览

    1.Linux中一些头文件的作用: #include <assert.h>       //ANSI C.提供断言,assert(表达式) #include <glib.h>  ...

  9. uva 10401 Injured Queen Problem(dp)

    题目链接:10401 - Injured Queen Problem 题目大意:给出一个字符串,要求在n * n(n为字符串的长度)的棋盘上摆放n个受伤的皇后,受伤的皇后只能攻击到同一列和它周围8个格 ...

  10. Magento How To Display Product Custom Option On list.phtml

    Some time we need to display custom option of product on category list page to achive this task we o ...