面试题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. CSS1-3基礎知識

    CSS1-3基礎知識 1.css排版 css在html內排版: <style type='text/css'> 標記名{} .類型名{} #ID名{} 標記名,.類型名,#ID名{} &l ...

  2. oracle pl/sql 基础

    一.pl/sql developer开发工具pl/sql developer是用于开发pl/sql块的集成开发环境(ide),它是一个独立的产品,而不是oracle的一个附带品. 二.pl/sql介绍 ...

  3. mysql用户权限配置

    创建管理员: mysqladmin -u root password 123456 登录 mysql -u root -p 建库及授权 > create database bdp charact ...

  4. 配置 VirtualBox backend - 每天5分钟玩转 Docker 容器技术(75)

    Rexy-Ray 支持多种 backend,上一节我们已经安装配置了 Rex-Ray,今天演示如何配置 VirtualBox backend. 在 VirtualBox 宿主机,即我的笔记本上启动 v ...

  5. hdu3756三分基础题

    Dome of Circus Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. hdu1671字典树

    Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. Angular JS中的路由

      前  言            本章节将为大家介绍 AngularJS 路由.AngularJS 路由允许我们通过不同的 URL 访问不同的内容.通过 AngularJS 可以实现多视图的单页We ...

  8. Redis “瘦身”指南

    code[class*="language-"], pre[class*="language-"] { background-color: #fdfdfd; - ...

  9. REST架构概述

    REST概述 REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如 web 应用程序.它首次出现在 2000 年 Roy F ...

  10. ubuntu远程桌面介绍

    一.windows远程ubuntu14.04 由于xrdp.gnome和unity之间的兼容性问题,在Ubuntu 14.04版本中仍然无法使用xrdp登陆gnome或unity的远程桌面,现象是登录 ...