剑指offer快速回忆之高质量的代码

前言

何为高质量:就是编码时考虑到代码的容错能力、异常情况、资源回收、小数精度问题、考虑边界、变量函数命名有章可循
数值的整数次方、打印从1到最大的n位数、正则表达式匹配、表示数值的字符串、调整数组顺序是奇数位于偶数前边、链表倒数k节点、链表入口节点、反转链表、合并链表、树的子结构

摘要

要注意代码的规范性(书写布局命名)、完整性(正常边界输入、错误处理)、鲁棒性(可以抵抗不合法的输入)

代码规范性

  1. 清晰的书写
  2. 清晰的布局
  3. 合理的命名

代码完整性

就是完成基本功能、输入边界值能得到正确的输出、堆不合规范的非法输入做了合理的错误处理。
  1. 测试驱动编程(正确,边界,错误)
  2. 错误处理方式(返回值,全局变量,异常)
1.数值的整数次方

实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

1.应考虑所有的输入情况(+-0)*(+-0)也就9种
2.参考如下公式,提升效率
3.用右移代替判断奇偶数

在这里插入图片描述

2.打印从1到最大的n位数

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
.
变形:大数M和大数N的加减乘除(这个乘法有优化的)

坑:n可能很大,大于Long Long的范围
思路一:用String,注意判断截止条件要求O(1),注意打印不要打印开头的0
思路二:用int[],回溯,注意打印不要打印开头的0
3.正则表达式匹配

请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。

思路:可以说是动归或者递归
对于当前正在比较的字符s[i]和t[j]
如果t[j]='.'  表示匹配任意字符一次
如果t[j]='a' 表示只能匹配'a'
如果t[j]='*' 表示可以匹配0次或者多次(多次包括1次)
如果能走到这步说明ij的考验通过了,剩下的就看0-i和0-j的考验了
4.表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"及”-1E-16"都表示数值,但"12e"、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。

其实匹配模式就是:A[.[B]][e|EC]或者.B[e|EC],其中AC可以带正负号
但是没有必要按照正则表达式匹配来做,因为模式固定了,上一题的模式是不固定的
所以我们只需要手动模拟匹配模式即可(就是写if else)
书上写了俩个方法挺好:scanInteger()和scanUnsignedInteger()
5.调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

本题重点在可扩展的代码,将判断是否为奇数改造成一个方法,可以根据传入的方法
来将数组分成各种部分

代码鲁棒性

鲁棒性是英文Robust的音译,有时也翻译成健壮性

6.链表中倒数第k个节点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。

考察是鲁棒性,空指针,链表长度<k,k=0
7.链表中的入口节点

如果一个链表中包含环,如何找到环的入口节点

使用快慢指针,当相遇时,快指针走了慢指针的2倍,所以从0-满指针和满指针到快指针的长度
是相等的。又因为这两段的后几个节点是一样的,显然第一个一样的节点就是入口。可以让慢指
针和快指针分别从0和快指针当前位置出发,每人同时走一步,当二者相遇时,相遇节点就是入
口。(有点数学的意思,自己去算)
8.反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

还是主要是鲁棒性,写出来的代码至少要能应付以下三种输入:
1.null
2.一个节点的链表
3.多个节点的链表
9.合并两个排序的链表

合并两个排好序的链表,合并之后是排好序的

还是主要考验鲁棒性,上边说了三种输入,两个链表的输入就有3*3=9种组合
10.树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。

本题的val是double,判断两个double是否相等是不能直接用==的
因为计算机表示小数都是有误差的,就算你两次存同一个值都有可能不相等(误差)
所以,这里等就只需验证他们只差的绝对值是不是在一个很小的范围内即可
(num1-num2>-0.00000001)&&(num1-num2<0.00000001)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值