面试题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(一)的更多相关文章

  1. 剑指Offer面试题:1.实现Singleton模式

    说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...

  2. 剑指Offer面试题:14.链表的倒数第k个节点

    PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...

  3. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  4. 《剑指offer》面试题11: 数值的整数次方

    面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...

  5. 剑指 Offer 题目汇总索引

    剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格              ...

  6. 面试题目——《剑指Offer》

    1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...

  7. 剑指offer习题集2

    1.把数组排成最小的数 class Solution { public: static bool compare(const string& s1, const string& s2) ...

  8. 剑指offer习题集1

    1.打印二叉树 程序很简单,但是其中犯了一个小错误,死活找不到,写代码要注意啊 这里左右子树,要注意是node->left,结果写成root->left vector<int> ...

  9. 剑指Offer:面试题20——顺时针打印矩阵(java实现)

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...

  10. 牛客网上的剑指offer题目

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...

随机推荐

  1. PHP buffer的机制

    PHP的buffer是这样的: 输出的字符串 => PHP buffer => 等待输出 => web 服务器的缓冲区 => tcp 缓冲区 => 客户端.过程其实相当的 ...

  2. C++中const用于函数重载

    C++中const用于函数重载 常成员函数和非常成员函数之间的重载 首先先回忆一下常成员函数 声明:<类型标志符>函数名(参数表)const: 说明: (1)const是函数类型的一部分, ...

  3. Spring详解(七)------事务管理

    PS:本篇博客源码下载链接:http://pan.baidu.com/s/1mi3NhX2 密码:3io2 1.事务介绍 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指 ...

  4. python之testcenter操作

    一.设置python环境 1. 从以下路径中将StcPython.py文件拷贝出来 Linux: /Installdir/Spirent_TestCenter_4.xx/Spirent_TestCen ...

  5. zoj 1889 ones 数学

    Ones Time Limit: 2 Seconds      Memory Limit: 65536 KB Given any integer 0 <= n <= 10000 not d ...

  6. zoj1151 zoj1295 Word Reversal 字符串的简单处理

    Word Reversal Time Limit: 2 Seconds      Memory Limit:65536 KB For each list of words, output a line ...

  7. c#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换

    字节数组byte[]与图片image之间的转化 字节数组转换成图片 public static Image byte2img(byte[] buffer) { MemoryStream ms = ne ...

  8. 为选择屏幕的字段设置F4帮助

    在没有参考 数据元素,域和搜索帮助的情况下,自定义F4 帮助 1,PARAMETERS: p_bukrs(4) TYPE C MATCHCODE OBJECT H_T001. 2,AT SELECTI ...

  9. Android架构: MVC 新浪微博

    由于项目的需要,最近研究了一下需要连接网络项目的MVC架构,参考了一下一个新浪微博的开发架构 http://www.open-open.com/lib/view/open1345524526767.h ...

  10. Java集合源码分析(二)Linkedlist

    前言 前面一篇我们分析了ArrayList的源码,这一篇分享的是LinkedList.我们都知道它的底层是由链表实现的,所以我们要明白什么是链表? 一.LinkedList简介 1.1.LinkedL ...