剑指offer-高质量的代码
小结:
- 规范性:书写清晰、布局清晰、命名合理
 - 完整性:完成基本功能、考虑边界条件、做好错误处理
 - 鲁棒性:采取防御性编程、处理无效输入
 
面试这需要关注
- 输入参数的检查
 - 错误处理和异常的方式(3种)
 - 命名的方式
 
需要考虑:功能测试、边界测试(例如超出边界,是大数?)、负面测试(不合法输入)
错误处理方式(可以与面试官讨论采用什么出错方式适合)
- 函数用返回值告诉是否出错:使用不方便,不能把这个函数计算结果直接作为参数传递给其他函数
 - 错误发生时设置一个全局变量:调用者容易忽略去检查和处理
 - 异常:抛出和处理
 
题-数值的整数次方:需要考虑基数是0还有指数是负数的情况,优化的话可以使用二分递归来求
细节:右移代替除,位与代替%(n&0×1就是求除以10的余数)
<string>里面还有个int atoi(const char *str) 函数是用来转化字符串为整数的,如果是这样的串" 232s3112",最后转化为232
题-打印从1到最大的n位数:要考虑越界,是大数怎么办,所以使用字符串来简单有效表示大数,还需要注重用递归的方法解决问题
题-删除链表的节点:直接将下一个节点的值复制到要删除的节点,然后改变指针,这样就不用去改要删去的上一个节点了
两处注意:(1)如果删除的节点是最后的节点;(2)如果删除的节点是头节点;
题19-正则表达式匹配:画有限状态机来分析有一点帮助
class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if(str==nullptr||pattern==nullptr)
            return false;
        return matchcore(str,pattern);
    }
    bool matchcore(char* str, char* pattern){
        if(*str=='\0'&&*pattern=='\0')  //设置结果的状态,很重要,必须要返回true
            return true;
        if(*str!='\0'&&*pattern=='\0')
            return false;
        if(*(pattern+1)=='*'){
            if(*str==*pattern||(*pattern=='.'&&*str!='\0')) //注意判断str指向的有没有到底很重要
                return matchcore(str,pattern+2)||matchcore(str+1,pattern)||matchcore(str+1,pattern+2);  //3种状态迁移很重要
            else
                return matchcore(str,pattern+2); //如果不能匹配那么只能直接跳过×
        }
        if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
            return matchcore(str+1,pattern+1);
        return false;
    }
};
题20-表示数值的字符串:表示数值的字符串遵循模式A[.[B]][e|EC] 或者 .B[e|EC]
题21-调整数组顺序使奇数位于偶数的前面
要点:设置前后两个指针,如果找到两个不符合的数就交换,O(N),如何可扩展:使用函数指针的参数,即bool (*func)(int),在函数中直接用func表示,在外边具体实现一个比较函数,例如bool isEven(int ),最后在主函数体中,参数该函数的指针。
3.4代码的鲁棒性
防御性编程是习惯,最简单的就是在函数入口添加代码以验证用户输入是否符合要求
题23-链表中环的入口节点:三步(1)两指针设置不同速度,当快指针追上慢指针时代表有环;(2)计算环大小,通过第1步的计数差,或者是再从追上的地方走到下次追到的地方;(3)设置先后相隔环大小的指针遍历,当两个指针指向同一个节点,就是入口节点
题24-反转链表:设置指针,记录,想好测试用例,防止崩溃、断裂的发生;
题25-合并两个排序的链表:可以用递归(调用自身,递推加回归)完成合并过程;
题26-树的子结构:递归,当找到与子结构的根相等的节点,当它就是子结构的根,递归,如果没有成功,从左子树查找,如果不成功,继续查找右子树
细节:小数的比较不能用==(精度不同,表示有误差),自定义Equal函数,如果差值的绝对值小于10的-7次方就是相等
class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if(pRoot1==nullptr||pRoot2==nullptr) return false; //约定空树不是任意一个树的子结构
        bool res=false;
        if(pRoot1->val==pRoot2->val) res=FindSubtree(pRoot1,pRoot2);
        if(!res) res=HasSubtree(pRoot1->left,pRoot2);
        if(!res) res=HasSubtree(pRoot1->right,pRoot2);
        return res;
    }
    bool FindSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
        if(pRoot2==nullptr) return true;
        if(pRoot1==nullptr) return false;
        if(pRoot1->val!=pRoot2->val) return false;
        return FindSubtree(pRoot1->left,pRoot2->left)&&FindSubtree(pRoot1->right,pRoot2->right);
    }
};
剑指offer-高质量的代码的更多相关文章
- 【剑指offer】Java版代码(完整版)
		
原文地址:https://blog.csdn.net/baiye_xing/article/details/78428561 一.引言 <剑指offer>可谓是程序猿面试的神书了,在面试中 ...
 - 剑指offer】Java版代码(完整版)
		
转自:剑指offer]Java版代码(完整版) 转自:[剑指offer] JAVA版题解(完整版)
 - 剑指offer(1):数组
		
1 写作计划 最近在看<剑指offer>,发现自己有很多的数据结构与算法的基础知识要复习,<好书一起读(131):让写作更好>中提到用写作倒逼阅读,我很是赞同.所以,计划以&l ...
 - 剑指Offer——乐视笔试题+知识点总结
		
剑指Offer--乐视笔试题+知识点总结 情景回顾 时间:2016.9.19 15:10-17:10 地点:山东省网络环境智能计算技术重点实验室 事件:乐视笔试 总体来说,乐视笔试内容体量不算少, ...
 - [转]剑指offer之Java源代码
		
一.引言 <剑指offer>可谓是程序猿面试的神书了,在面试中帮了我很多,大部分面试的算法题都会遇到原题或者是类似的题.但是书上的代码都是C版的,我在这里整理了一份Java版的代码供大家学 ...
 - 《剑指offer》面试题28:字符串的排列(牛客网版本) java
		
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...
 - 剑指offer 面试8题
		
面试8题: 题目:二叉树的下一个节点 题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 解题思路:详见剑 ...
 - 剑指offer 面试42题
		
面试42题: 题目:连续子数组的最大和 题:输入一个整形数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n) 解题思路:在数组里从前 ...
 - 剑指offer—第三章高质量代码(数值的整数次方)
		
高质量的代码:容错处理能力,规范性,完整性.尽量展示代码的可扩展型和可维护性. 容错处理能力:特别的输入和处理,异常,资源回收. 规范性:清晰的书写,清晰的布局,合理的命名. 完整性:功能测试,边界测 ...
 - 代码题 — 剑指offer题目、总结
		
剑指offer题目总结: https://www.cnblogs.com/dingxiaoqiang/category/1117681.html 版权归作者所有,任何形式转载请联系作者.作者:马孔多 ...
 
随机推荐
- 转:Simple Introduction to Dirichlet Process
			
来源:http://hi.baidu.com/vyfrcemnsnbgxyd/item/2f10ecc3fc35597dced4f88b Dirichlet Process(DP)是一个很重要的统计模 ...
 - 【转】C# 利用反射动态创建对象
			
http://www.cnblogs.com/Jan_Dai/archive/2010/11/09/1872812.html Activator.CreateInstance(Type.GetType ...
 - [洛谷P5105]不强制在线的动态快速排序
			
题目大意:有一个可重集$S$,有两个操作: $1\;l\;r:$表示把$S$变为$S\cup[l,r]$ $2:$表示将$S$从小到大排序,记为$a_1,a_2,\dots,a_n$,然后求出$\bi ...
 - 存储引擎(Mysql)
			
最常使用的2种存储引擎:1.Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam.每个MyISAM在磁盘上存储成三个文件.文件名都和表名相同, ...
 - BZOJ2830 & 洛谷3830:[SHOI2012]随机树——题解
			
https://www.luogu.org/problemnew/show/P3830#sub <-题面看这里~ https://www.lydsy.com/JudgeOnline/prob ...
 - The driver has not received any packets from the server
			
解决方法: jdbc的url添加参数: jdbc.url=jdbc:mysql://localhost:3306/totosea?useUnicode=true&characterEncodi ...
 - bzoj4773: 负环(倍增floyd)
			
浴谷夏令营例题...讲师讲的很清楚,没看题解代码就自己敲出来了 f[l][i][j]表示i到j走2^l条边的最短距离,显然有f[l][i][j]=min(f[l][i][j],f[l-1][i][k] ...
 - [BJOI2018]求和
			
link 其实可以用$sum(i,j)$表示从$i$到$1$的$k$次方的值,然后就是$lca$的基本操作 注意,能一起干的事情就一起搞,要不会超时 #include<iostream> ...
 - 51Nod 1305 Pairwise Sum and Divide | 思维 数学
			
Output 输出fun(A)的计算结果. Input示例 3 1 4 1 Output示例 4 first try: #include "bits/stdc++.h" using ...
 - PHP系统编程--03.PHP进程信号处理
			
PHP的pcntl扩展提供了信号处理的功能,利用它可以让PHP来接管信号的处理,在开发服务器端守护进程方面,信号处理至关重要. 函数原型 bool pcntl_signal(int $signo ,c ...