《剑指Offer》题六十一~题六十八
六十一、扑克牌中的顺子
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。
六十二、圆圈中最后剩下的数字
题目:0, 1, …, n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
六十三、股票的最大利润
题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9, 11, 8, 5, 7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。
六十四、求1+2+…+n
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
提示:这道题本身没什么实际意义,但不少面试官认为这是一道考查应聘者发散思维能力的题目。
分析:循环只是让相同的代码重复执行n遍而已,我们可以不用for和while来达到这个效果。比如我们先定义一个类型,接着创建n个该类型的实例,那么这个类型的构造函数将会被调用n次。
利用构造函数求解:
class Temp {
public:
Temp()
{
N++;
SUM += N;
}
static void reset()
{
N = 0;
SUM = 0;
}
static unsigned int getSum()
{
return SUM;
} private:
static unsigned int N;
static unsigned int SUM;
}; unsigned int sum_one_to_n(unsigned int n)
{
Temp::reset(); Temp *arr = new Temp[n];
delete []arr;
arr = nullptr; return Temp::getSum;
}
六十五、不用加减乘除做加法
题目:写一个函数,求两个整数之和,要求在函数体内不得使用“+”、“-”、“×”、“÷”四则运算符号。
提示:对数字做运算,除四则运算之外,也就只剩下位运算了。
分析:二进制加法和十进制加法的过程一样,都是①各位相加不进位,②记下进位,③把前两步的结果相加。对于二进制加法来说,第一步的结果和异或的结果是一样的,第二步的结果等价于两个数先做位与运算,然后再向左移动一位,第三步把前两个步骤的结果相加,过程依然是重复前面两步。
位运算解法:
int add_with_bit(int num1, int num2)
{
int sum = 0;
int carry = 0;
do {
// 第一步
sum = num1 ^ num2;
// 第二步
carry = (num1 & num2) << 1;
// 第三步
num1 = sum;
num2 = carry;
} while(num2 != 0); return sum;
}
六十六、构建乘积数组
题目:给定一个数组A[0, 1, …, n-1],请构建一个数组B[0, 1, …, n-1],其中B中的元素B[i] = A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。
六十七、把字符串转换成整数
题目:写一个函数StrToInt,实现把字符串转换成整数这个功能。要求不能使用atoi或者其他类似的库函数。
没有考虑非法输入的解法:
int StrToInt(char *pStr)
{
if(pStr == nullptr) return -1;
int num = 0;
char *pCur = pStr;
while(*pCur != '\0') {
num = num * 10 + *pCur - '0';
pCur++;
}
return num;
}
分析:上述解法虽简洁,但也遗漏了许多检错点。比如,①当输入的字符串为空串或输入的字符串是"0"时,该函数都返回0;②'+'和'-'字符是合法的输入符,而其他字符是非法字符;③当输入的字符串只含"+"和"-"时,虽然它们是合法字符,但该字符串却不合法。
完善后的代码:
int StrToInt(char *pStr)
{
error = 0;
if(pStr == nullptr) {
return 0;
error = 1;
}
if(*pStr == '\0') {
return 0;
error = 2;
}
int plus = 0;
int minus = 0;
if(*pStr == '+') {
plus = 1;
pStr++;
}
if(*pStr == '-') {
minus = 1;
pStr++;
}
int num = 0;
while(*pStr != '\0') {
if(*pStr > '9' || *pStr < '0') {
return 0;
error = 3;
}
num = num * 10 + *pStr - '0';
pStr++;
}
if(minus == 1) {
num *= -1;
}
if(num == 0)
error = 4;
return num;
}
六十八、树中两个节点的最低公共祖先
题目:输入两个树节点,求它们的最低公共祖先。(1)若该树是二叉搜索树;(2)若该树只是普通的树,但树中的节点中有指向父节点的指针;(3)若该树只是普通的树,而且树中的节点没有指向父节点的指针。
《剑指Offer》题六十一~题六十八的更多相关文章
- 《剑指offer》第二十一题(调整数组顺序使奇数位于偶数前面)
// 面试题21:调整数组顺序使奇数位于偶数前面 // 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有 // 奇数位于数组的前半部分,所有偶数位于数组的后半部分. #inclu ...
- 《剑指offer》第十一题(旋转数组的最小数字)
// 面试题:旋转数组的最小数字 // 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. // 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组 // {3, ...
- 剑指Offer(二十一):栈的压入、弹出序列
剑指Offer(二十一):栈的压入.弹出序列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...
- 剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数)
剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数) 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https:// ...
- [持久更新] 剑指offer题目Python做题记录
第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...
- 【剑指Offer】俯视50题之21 - 30题
面试题21包括min函数的栈 面试题22栈的压入.弹出序列 面试题23从上往下打印二叉树 面试题24二叉搜索树的后序遍历序列 面试题25二叉树中和为某一值的路径 面试题26复杂链表的复制 ...
- 《剑指offer》第十三题(机器人的运动范围)
// 面试题:机器人的运动范围 // 题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...
- 《剑指Offer》第1题(Java实现):在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
一.题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...
- 《剑指Offer》第20题(Java实现):定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
一.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 二.思路解析 首先定义一个Integer类型的栈,记为stack,此栈用来完成数据 ...
- 《剑指offer》第二十七题(二叉树的镜像)
// 面试题27:二叉树的镜像 // 题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像. #include <iostream> #include "BinaryTree ...
随机推荐
- app后端api设计【转】
博客:https://blog.csdn.net/newjueqi/article/details/44037011 app和后端的交互,一般都是通过后端提供的api实现.api的设计,估计很多刚进入 ...
- Excel2013打开提示 文件格式和扩展名不匹配。文件可能已损坏或不安全。除非您信任其来源,否则请勿打开。是否仍要打开它?
有的时候打开xls文档时,会提示“文件格式和扩展名不匹配.文件可能已损坏或不安全.除非您信任其来源,否则请勿打开.是否仍要打开它?” 遇到这种情况,我们需要 1.win键+R键,打开“运行“,输入re ...
- angular.js-1初识
初识AngularJS AngularJS 为了克服HTML在构建页面上的不足,通过新的属性和表达式扩展了 HTML(AngularJS 通过指令扩展了 HTML,且通过表达式绑定数据到 HTML). ...
- 纯js轮播图练习-2,js+css旋转木马层叠轮播
基于css3的新属性,加上js的操作,让现在js轮播图花样越来越多. 而现在出现的旋转木马层叠轮播的轮播图样式,却是得到了很多人都喜爱和投入使用. 尤其是在各大软件中,频繁的出现在大家的眼里,在web ...
- thinkphp5使用workerman定时器定时爬取某站点新闻资讯等内容
1.首先通过 composer 安装workerman,在thinkphp5完全开发手册的扩展->coposer包->workerman有详细说明: #在项目根目录执行以下指令compos ...
- day31 进程和其他方法,锁,队列
1.进程的其他方法: 首先引入模块: import os from multiprocessing import Process p = Process(target=f,) 进程的id: p.pi ...
- 视频网站数据MapReduce清洗及Hive数据分析
一.需求描述 利用MapReduce清洗视频网站的原数据,用Hive统计出各种TopN常规指标: 视频观看数 Top10 视频类别热度 Top10 视频观看数 Top20 所属类别包含这 Top20 ...
- Flink实例-Wordcount详细步骤
link实例之Wordcount详细步骤 1.我的IDE是IntelliJ IDEA.在官网上https://www.jetbrains.com/idea/下载最新版2018.2的IDEA,如下图.破 ...
- CF 1033 C. Permutation Game
C. Permutation Game http://codeforces.com/contest/1033/problem/C 题意: 一个排列,每个位置i走到的位置j满足:a[j]>a[i] ...
- 一分钟了解spark的调优
Tuning Spark 数据序列化 内存调优 内存管理概述 确定内存消耗 调整数据结构 序列化 RDD 存储 垃圾收集调整 其他注意事项 并行度水平 减少任务的内存使用 广播大的变量 数据本地化 概 ...