剑指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题目
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...
随机推荐
- Thinkphp3.2版本使用163邮箱发(验证码)邮件
今天忽然想写一个用户修改密码的功能,又没有短信接口,只能选择用邮箱发送验证码啦,穷啊,没办法,哈哈,以下为正文. ------------------------------------------- ...
- 1.Bootstrap-简介
1.介绍 Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 2.HTML 模板 一个使用了 Boots ...
- Delphi10.2 VCL Forms Application 的构成
Delphi10.2 项目的构成(File Extensions of Files Generated by RAD Studio) Step1.打开 Delphi10.2,选择[File | New ...
- 移动端效果之Swiper
写在前面 最近在做移动端方面运用到了饿了么的vue前端组件库,因为不想单纯用组件而使用它,故想深入了解一下实现原理.后续将会继续研究一下其他的组件实现原理,有兴趣的可以关注下. 代码在这里:戳我 1. ...
- 【工具篇】.NET开发常用工具
1 问题概述 本篇文章主要介绍,笔者在开发工作中,常用的开发工具.见下表: 2 工具介绍 2.1 接口调试工具 —— Postman 2.1.1 推荐网站 https://www.get ...
- Tarjan LCA
强连通 迷宫城堡 Proving Equivalences Equivalent Sets Summer Holiday Intelligence System The King's Problem ...
- IDL 矩阵运算
矩阵相乘,A#B表示A的列乘以B的行,要求A的行数必须跟B的列数一致 IDL> A=[[0,1,2],[3,4,5]] IDL> B=[[0,1],[2,3],[4,5]] IDL> ...
- localStorage存值取值以及存取JSON,以及基于html5 localStorage的购物车
localStorage.setItem("key","value");//存储变量名为key,值为value的变量 localStorage.key = &q ...
- SQL SERVER 查看日志大小及日志已满的处理方法 (转)
--解决方法 --日志文件满而造成SQL数据库无法写入文件时,可用两种方法: --查看数据库日志大小 dbcc sqlperf(logspace) --清空日志. --1.打开查询分析器,输入命令 D ...
- python重试(指数退避算法)
本文实现了一个重试的装饰器,并且使用了指数退避算法.指数退避算法实现还是很简单的.先上代码再详细解释. 1.指数退避算法 欠奉.http://hugnew.com/?p=814 2.重试装饰器retr ...