剑指offer(一)
面试题3:二维数组中查找
题目描述:
在一个二维数组中,每一行都按照从左往右递增地顺序排序,每一列都按照从上往下递增的顺序排序。请完成一个函数,输入这样的一个数组和一个整数,判断数组中是否存在该整数。
算法一:直接查找,即采取遍历数组的方法;
算法二:从数组右上角开始比较;
算法三:从数组左下角开始比较;
算法四:如果数组是N*N,可以采取沿对角线进行比较的方法;
----------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------
面试题4:替换空格
题目描述:
请实现一个函数,把字符串中的每一个空格替换成“%20”。
这道题目的难点不是函数的实现,而是在面试过错中,需要弄清楚是在原始的字符串上作替换还是可以单独生成另外的字符串。
算法很简单,在此不多说。
---------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------
面试题5:从尾到头打印链表
题目描述:
输入一个链表的头节点,从尾到头打印链表链表中的每一个节点。
算法一:递归;
算法二:利用栈结构;
---------------------------------------------------------------------------分割线----------------------------------------------------------------------------------------
面试题6:重建二叉树
题目:输入某二叉树的前序遍历和中序遍历,请重建该二叉树。假设输入的前序遍历和中序遍历都不包含重复数字。
代码:
//二叉树节点
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode *m_pLeft;
BinaryTreeNode *m_pRight;
};
BinaryTreeNode* Construct(int *preOrder,int *inOrder,int length);
BinaryTreeNode* ConstructCore(int *startPreOrder,int *endPreOrder,int *startInOrder,int *endInOrder); BinaryTreeNode* Construct(int *preOrder,int *inOrder,int length)
{
if (NULL == preOrder || NULL == inOrder || length<=)
{
return NULL;
} return ConstructCore(preOrder,preOrder+length-,inOrder,inOrder+length-);
}
BinaryTreeNode* ConstructCore(int *startPreOrder,int *endPreOrder,int *startInOrder,int *endInOrder)
{
//前序遍历第一个数字是根节点值
int rootValue = startPreOrder[];
BinaryTreeNode *root = new BinaryTreeNode();
root->m_nValue = rootValue;
root->m_pLeft = root->m_pRight = NULL; if (startPreOrder == endPreOrder)
{
if (startInOrder == endInOrder && *startPreOrder == *startInOrder)
{
return root;
}
else
{
//throw std::exception("Invalid input.");
cout << "Invalid input.\n"; }
} //中序遍历中找到根节点值
int *rootInOrder = startInOrder;
while(rootInOrder <= endInOrder && *rootInOrder != rootValue)
++rootInOrder; if (rootInOrder == endInOrder && *rootInOrder != rootValue)
{
//throw std::exception("Invalid input.");
cout << "Invalid input.\n";
} int leftLength = rootInOrder - startInOrder;
int *leftPreOrderEnd = startPreOrder + leftLength;
if (leftLength > )
{
root->m_pLeft = ConstructCore(startPreOrder+,leftPreOrderEnd,startInOrder,rootInOrder-);
}
if (leftLength < endPreOrder - startPreOrder)
{
root->m_pRight = ConstructCore(leftPreOrderEnd+,endPreOrder,rootInOrder+,endInOrder);
}
return root; }
------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------------
面试题7:用两个栈实现队列
题目:用两个栈实现队列的插入和删除操作。
思想:stack1和stack2,每次队列插入元素时,都将该元素压入(push)stack1,队列删除元素时,首先判断stack2是不是空,如果是空的,将stack1中元素依次弹出(pop),然后压入stack2,直到stack1为空,再从stack2中删除栈顶元素(前提是stack2中此时有元素存在,否则有错,这也是需要考虑的边界条件)。
引申题目:用两个队列实现栈。
思想:和面试题7的解题思想是一致的。在实现的时候,始终有一个队列是空的。
面试题10:二进制1的个数
题目:输入一个整数,输出其二进制表示中1的个数。
思想:通过右移,然后与1做与运算,判断1的个数。
代码:
int NumberOf1(int n)
{
int count = ;
while(n)
{
if (n&)
{
count++;
}
n=>>;
}
return count;
}
以上代码的缺点是:当输入一个负数时,最终n=0xffffffff,然后进入死循环。
改进:此方法仍然需要移动32位
int NumberOf1(int n)
{
int count = ;
int flag = ;
while(n)
{
if (n&flag)
{
count++;
}
flag=<<;
}
return count;
}
继续改进:n有几个1,就只移动几次
int NumberOf1(int n)
{
int count = ;
while(n)
{
count++;
n=n&(n-);
}
return count;
}
在n=n&(n-1)操作中,每次都将n中最右边第一个不为0的数变为1,已经该位往右之后的所有位都变为0,而该位往左的位上的数都不会改变。
剑指offer(一)的更多相关文章
- 剑指Offer面试题:1.实现Singleton模式
说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...
- 剑指Offer面试题:14.链表的倒数第k个节点
PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...
- 《剑指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 题目汇总索引
剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格 ...
- 面试题目——《剑指Offer》
1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...
- 剑指offer习题集2
1.把数组排成最小的数 class Solution { public: static bool compare(const string& s1, const string& s2) ...
- 剑指offer习题集1
1.打印二叉树 程序很简单,但是其中犯了一个小错误,死活找不到,写代码要注意啊 这里左右子树,要注意是node->left,结果写成root->left vector<int> ...
- 剑指Offer:面试题20——顺时针打印矩阵(java实现)
题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...
- 牛客网上的剑指offer题目
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...
随机推荐
- 100%解决ios上audio不能自动播放的问题
由于ios的安全机制问题,不允许audio和video自动播放,所以想要使audio标签自动播放那是实现不了的,即使给play()也是播放不了. 解决方法: 首先,创建audio标签:<audi ...
- jsonp其实很简单【ajax跨域请求】
js便签笔记(13)——jsonp其实很简单[ajax跨域请求] 前两天被问到ajax跨域如何解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了许多资 ...
- iOS连续dismiss几个ViewController的方法
原文链接:http://blog.csdn.net/longshihua/article/details/51282388 presentViewController是经常会用到的展现ViewCont ...
- Html语言,使用<a>标签发送电子邮件
<a>标签有一个功能是可以链接Email地址,使用mailto能让访问者便捷向网站管理者发送电子邮件. 使用mailto 属性时请参考下表: 如果mailto里同时有多个参数,第一个参数必 ...
- java学习——java中的反射学习笔记
Java--reflect 一.Class类的使用 什么是Class类? 1:在面向对象的世界中,万事万物皆对象. java语言中,静态的成员,普通数据类型类是不是对象呢? 是,对象!是类的对象! 类 ...
- 使用LayUI展示数据
LayUI是一款免费,开源,轻量级的前端cms框架,适用于企业后端,能快速上手开发,集成了常用的组件,还有完善的文档和社区. 点击查看 文档地址 下载框架 使用: 1.把这个5个文件项都拷贝到项目中 ...
- C#仪器数据文件解析-XPS文件
XPS为微软推出的类似于Adobe PDF的一种文件格式,个人认为XPS很好,但毕竟PDF已经被大家所熟知,因此XPS的使用很少,也少有仪器数据输出为该格式. XPS百度百科:https://baik ...
- javascript集合的交,并,补,子集,长度,新增,删除,清空等操作
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...
- c#枚举 获取枚举键值对、描述等
using System; using System.Collections.Generic; using System.Collections.Specialized; using System.C ...
- [Python]Codecombat攻略之远边的森林Forest(1-40关)
首页:https://cn.codecombat.com/play语言:Python 第二界面:远边的森林Forest(40关)时间:2-6小时内容:if/else.关系操作符.对象属性.处理输入网页 ...