剑指offer 面试题0:高质的代码:即考虑边界条件、特殊输入和错误处理
Q:把一个字符串转换为整数。
A1:一个普通但漏洞百出的解法。
int StrToInt(char* str)
{
int number = 0;
while (*str != 0)
{
number = number * 10 + *str - '0';
++str;
}
return number;
}
漏洞:没有考虑输入的字符串中是否有非数字字符或正负号或空格,并不能转换成整数时该如何错误处理;没有考虑溢出;如果传入是空指针,程序将崩溃,代码不够鲁棒。
A2:初级程序员的解法。
#include <iostream>
using namespace std; int StrToInt(const char* str)
{
int symbol = 1;
int number = 0;
//空指针
if (str == nullptr)
{
return 0;
}
//正负号
if (*str == '-')
{
symbol = -1;
++str;
}
while (*str != 0)
{
if (*str <= '9' && *str >= '0')
{
int temp = number * 10 + *str - '0';
if ((temp - (*str - '0')) / 10 != number)
{
//产生溢出
return 0;
}
number = number * 10 + *str - '0'; //利用位运算效率能高点 number = (number << 1) + (number << 3) + *str & 0xf;
++str;
//举个例子, 3 * 10 + 5 = 35, 如果(35 - 5) / 10不等于3,那么就产生了溢出
}
else
{
//存在异常字符
return 0;
}
}
return number*symbol;
} int main()
{
const char* str = "-10001252554354534";
cout << StrToInt(str) << endl;
return 0;
}
Q:求链表中的倒数第k个节点。
A:注意要考虑空指针,节点个数小于k,k=0等情况
struct ListNode
{
int val;
ListNode* next;
ListNode(int x) :val(x), next(nullptr) {}
}; ListNode* FindKthToTail(ListNode* head, unsigned int k)
{
//节点为空,或者k为0
if (head == nullptr || 0 == k)
{
return nullptr;
}
ListNode* pA = head;
ListNode* pB = head;
int nodeCnt = 0;
while (pA->next != nullptr)
{
++nodeCnt;
pA = pA->next;
}
//k大于节点数量
if (k > nodeCnt)
{
return nullptr;
}
pA = head;
for (unsigned int i = 0; i < k - 1; ++i)
{
pA = pA->next;
}
while (pA->next != nullptr)
{
pA = pA->next;
pB = pB->next;
}
return pB;
}
剑指offer 面试题0:高质的代码:即考虑边界条件、特殊输入和错误处理的更多相关文章
- 剑指offer 面试题0:扎实的基础:即编程语言、数据结构和算法
编程语言: Q:如果写的函数需要传入一个指针,则是否需要为该指针加上const?把const加在指针不同的位置是否有区别? A:const是用来声明一个常量的,如果不想让一个值改变就应该加上const ...
- C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解
剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
剑指offer 面试题39:判断平衡二叉树 提交网址: http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
随机推荐
- 项目实战:Qt多通道数据采集系统(通道配置、电压转换、采样频率、通道补偿值、定时采集、导出exel和图表、自动XY轴、隐藏XY轴、实时隐藏显示通道)
需求 1.通道使能.选择.更改通道名称.设置显示颜色 2.采样率可设置(Sa/s/chj) 3.单位换算,按照给定的进行换算 4.对通道可进行设置补偿值 5.通道取消可动态显示和隐藏,并可 ...
- http请求user_agent字段解析
浏览器的常见User Agent 各字段的解释 浏览器的User Agent字段令人迷惑,例如:某一版本的Chrome访问网络时,User Agent字段如下: Mozilla/5.0 (Window ...
- uni-app中封装统一请求函数
封装统一请求函数有利于项目的维护 整体功能简单实用,但小编遇到一个巨坑,项目中在vue文件使用跳转方法,url参数输入 "/" 后工具提示的路径为 "/pages/log ...
- 微信小程序下拉加载下一页
小程序做得多了,有些常用功能就有必要记录一下 请看详解: 微信小程序之下拉触底时加载下一页 wxml参考: <scroll-view class='dataContainer' scroll-y ...
- vue 重置data
Object.assign(this.$data, this.$options.data())
- jQuery的事件机制和其他知识
jQuery 设置宽度和高度 宽度操作: $(selector).height(); //不带参数表示获取高度 $(selector).height(200); //带参数表示设置高度 宽度操作: ...
- C# 中 ConcurrentDictionary 一定线程安全吗?
根据 .NET 官方文档的定义:ConcurrentDictionary<TKey,TValue> Class 表示可由多个线程同时访问的线程安全的键/值对集合.这也是我们在并发任务中比较 ...
- 使用CentOS8来部署php7.4
使用CentOS8来部署php7.4 #安装REMI源 dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm #查看P ...
- matplotlib学习日记(七)---误差棒图
(一)误差棒图----误差置信区间的表示 import matplotlib.pyplot as plt import numpy as np x = np.linspace(0.1, 0.6, 10 ...
- Hyperledger fabric 1.4 环境搭建(一)
Hyperledger fabric 1.4 环境搭建(一) 1.更换下载源 更换apt的下载源,因为官方下载源很慢,需要更换到国内的镜像站 1.1.进入/etc/apt/目录 cd etc/apt ...