对面试题(剑指offer)产生的一些思考。
零散的思绪。另外,推荐《剑指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)产生的一些思考。的更多相关文章
- 剑指Offer面试题:1.实现Singleton模式
说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...
- 《剑指offer》面试题12:打印1到最大的n位数
面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...
- 《剑指offer》面试题11: 数值的整数次方
面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 《剑指Offer》- 面试题3
<剑指Offer——名企面试官精讲典型编程题> 面试题3: 二维数组元素从左到右.从上到下递增,输入一个二维数组和一个整数, 查找该整数. 自己的思路:有序条件下进行查找,当然最简单 ...
- 【剑指Offer学习】【全部面试题汇总】
剑指Offer学习 剑指Offer这本书已经学习完了.从中也学习到了不少的东西,如今做一个总的文件夹.供自已和大家一起參考.学如逆水行舟.不进则退.仅仅有不断地学习才干跟上时候.跟得上技术的潮流! 全 ...
- 【强烈推荐】《剑指Offer:名企面试官精讲典型编程题》一书中IT名企经典面试题
各位程序猿: <剑指Offer>一书源自该书作者何海涛坚持更新与编写的博客(http://zhedahht.blog.163.com/),该博客收集整理了大量如微软.Goo ...
- 剑指offer编程题Java实现——面试题5从头到尾打印链表
题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...
- 剑指offer编程题Java实现——面试题6重建二叉树
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...
随机推荐
- C语言中的指针数组和数组指针
代码: #include <iostream> using namespace std; int main(){ ]; ]; cout<<sizeof(a)<<en ...
- C语言结构体的字节对齐
Test Code: #include <iostream> #include <cstring> using namespace std; struct A{ int a; ...
- 用excel做一幅像素画
开发背景 看到网上有人发教程,如何通过在excel里设置单元格颜色画一幅画,感觉手工做太复杂,就打算用程序实现一个. 开发运行环境 python 2.7 PIL xlsxwriter 用法 pytho ...
- vector的用法总结
Reference Constructors vector Constructs a vector of a specific size or with elements of a specific ...
- DNF(一.YUM已死,DNF代之)
Yum还没学好呢,突然听到已经要被抛弃了.恐慌至极.. 在最新版的Fedora 22 抛弃了Yum包管理器,取而代之的是DNF.. 那么搜搜 Fedora 22 Release Note.. 官方给出 ...
- 使用grid++report打印选中行
接上一篇<hibernate+spring+mvc+Easyui框架模式下使用grid++report的总结>对grid++report做进一步开发 先写一下实现流程: 1.默认为全部载入 ...
- 再谈Redirect(客户端重定向)和Dispatch(服务器端重定向)
这是两个常常被放在一起进行比较的概念,今天对这两个概念再重新回顾一下,前者发生在客户端(浏览器),后者发生在服务器端,因此也有人把前者称为客户端重定向,把后者称为服务器端重定向,虽然对于后者这种称谓并 ...
- GET: https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login? loginicon=true &uuid=odcptUu2JA==&tip=0
GET: https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login? loginicon=true &uuid=odcptUu2JA==&am ...
- MongoDB GUI管理工具Mongo VUE
一.前言 现在越来越多的公司开始采用非关系数据库了,并且很多公司的面试都要求面试 者有MongoDB的使用经验,至于非关系数据库与关系型数据库之间的区别大家可以自行百度.但是作为程序员的我们,既然大部 ...
- chrome无法使用非官方商店扩展解决办法
自己开发的工具性插件不想放在官方商店(当然也有可能是工作相关的工具不能放在官方商店),由于新版本的chrome不允许非官方商店的插件进行安装使用,所以出现一个头疼的问题:每次开启chrome都 ...