![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
文章平均质量分 63
peiyao456
这个作者很懒,什么都没留下…
展开
-
【剑指offer】面试题35-第一个只出现一次的字符
问题描述:在字符串中找出第一个只出现1次的字符。如输入“abaccdeff”,输出b。问题分析:方法1:最直白最粗暴的方法。 具体实现方法:对于字符串中的每一个字符,都去遍历字符串,查找是否是只出现了一次。这样一来,时间复杂度是O(N*N),N是字符串中字符的个数。这样的办法往往不是最好的办法。 方法2:哈希法。 既然上边的方法时间复杂度太高,我们可以采用空间换取时间的哈希法去解决问题。 具原创 2017-01-20 15:12:52 · 686 阅读 · 0 评论 -
【剑指offer】面试题36-数组中的逆序对
题目描述:在数组中的两个数字如果前边的数字大于后边的数字,则这两个数值组成一个逆序对。输入一个数组,求出这个数组中逆序对的总数。问题分析:方法1:粗暴的办法。 具体实现方法:从数组中的第一个元素开始进行遍历,每次都去该元素之后的元素中查找多少个小于当前元素的值,然后进行统计。返回结果即可。 时间复杂度O(N*N),空间复杂度O(1)。 方法2:归并排序的思想。 由于上述方法的时间复杂度比较高原创 2017-01-21 14:54:31 · 614 阅读 · 0 评论 -
【剑指offer】面试题37-两个单链表的第一个公共结点
问题描述:输入两个链表,找出链表的第一个公共结点。问题分析:方法1:粗暴的办法。 从一个链表的第一个结点开始,再另一个链表上查找是否是交点(指向结点的指针一样),这样的话,如果一个链表的长度是m,另一个链表的长度是n,则时间复杂度是O(mn)。 方法2: 我们知道链表相交,不仅仅只是结点里的data值一样,next指针也是一样的,也就是说,如果两个链表从某一个结点处开始相交,那么之后两个链表一原创 2017-01-22 20:37:58 · 989 阅读 · 0 评论 -
【剑指offer】面试题38-数字在排序数组中出现的次数
问题描述:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3字数组中出现了4次,因此输出4.问题分析:方法1:利用二分查找的思想,找到中间数据是不是给定的数字,如果是,则继续前后进行遍历,统计次数。如果不是的话,按照中间数字与给定数字的大小比较,去前半区间或者后半区间去查找。这样的话,时间复杂度就是O(N)(N是数组中元素的个数)。 方法2:上边原创 2017-01-23 14:23:29 · 791 阅读 · 0 评论 -
【剑指offer】面试题39-二叉树的深度
题目一:问题描述:输入一棵二叉树的根节点,求出二叉树的深度。二叉树的深度就是二叉树中从根节点到叶子结点形成的最长路径的长度。问题分析:求出左子树的深度和右子树的深度,树的深度就是左右子树深度较大值加1.代码实现:#include<iostream>using namespace std;#include<cassert>struct BinaryNode{ int _data;原创 2017-01-24 13:29:18 · 664 阅读 · 0 评论 -
【剑指offer】面试题40-数组中只出现一次的数字
问题描述:一个整形数组中除了两个数字外,其他数字都出现了两次,请找出这两个只出现一次的数字。时间复杂度为O(N),空间复杂度为O(1)。问题分析:看到这个问题,或许有些人就是不知道从何下手。如果说题目中是只有一个数字只出现一次,找出这个数字。我们可以遍历数组,也可以根据异或的性质,将所有的数字进行异或,得到的结果就是在只出现一次的数字。 在本题目中,如果我们可以确定只出现一次的两个数字中的其他一个原创 2017-01-25 11:56:28 · 389 阅读 · 0 评论 -
【剑指offer】面试题41-和为S的两个数VS和为S的连续正数序列
题目一:问题描述:输入一个递增的数组和一个数字s,在数组中查找两个数,使得他们的和刚好是s,如果有多对数字的和是s,输出任意的一对即可。问题分析:方法1:简单粗暴的办法。 具体实现:从数组的第一个数开始,依次判断其余的数与该数的和是不是s,这样就可以解决问题。时间复杂度是O(N*N)。 方法2:上边的方法虽然可以解决问题,但是它却没有利用题目最重要的条件–数组是升序的。有了这个最重要的条件,题目原创 2017-01-26 19:24:51 · 484 阅读 · 0 评论 -
【剑指offer】面试题42-翻转单词顺序VS左旋转字符串
题目一:问题描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字符一样处理。比如输入字符串”I am a student.”输出字符串”student. a am I”.问题分析:这种题目比较简单,翻转两次字符串就可以。第一次翻转整体字符串,第二次翻转单个单词。当然两次顺序可以颠倒~~实现起来比较简单,主要就是翻转函数。代码实现:#include<io原创 2017-01-29 21:04:30 · 531 阅读 · 1 评论 -
【剑指offer】面试题34-丑数
问题描述:我们把只包含因子2,3,5的数称为丑数,求按照从小到大的顺序的第1500个丑数。例如6,8都是丑数,但14不是,因为14含有因子7.我们习惯上把1当做第一个丑数。问题分析:方法1:从1开始,对每一个数都进行判断,看是否只含有2,3,5的因子,直到找到第1500个丑数为止。这种方法理解起来比较容易,但是却做了很多无用功,比如,对于非丑数,都进行了模除模除的操作,所以,时间上是比较浪费的。原创 2017-01-19 12:45:07 · 654 阅读 · 2 评论 -
【剑指offer】面试题33-把数组排成最小的数
题目描述:输入一个正整数的数组,把数组里的所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。并给出算法的证明。比如输入数组,{3,32,321},则打印出这3个数字能排出的最小的数字是321323.题目分析:这个题目最简单的做法也就是最容易想到的解法就是把数组中的数字进行全排列,求出最小的数。这样不是不可以,只是时间空间复杂度比较大。 下边从一个简单的例子开始分析: 假如给定的数组原创 2017-01-18 22:48:40 · 836 阅读 · 0 评论 -
【剑指offer】面试题32-从1到n整数中1出现的次数
题目描述:输入一个整数N,求出1~N这N个整数的十进制表示形式中 1出现的次数。比如输入12,从1~12这12个整数中包含1的数字有:1,10,11,12,1总共出现了5 次。题目分析:看到这个题目,大多数人的想法或许就是:循环遍历1~N中的每一个数,然后求出每个数中1的个数,然后求和。这样做的话,需要将N个数遍历一遍,然后将每个数的每一位遍历一次,时间复杂度是比较高的(大于O(N)),所以我们依然原创 2017-01-17 19:24:05 · 667 阅读 · 0 评论 -
剑指offer---杨氏矩阵的查找
杨氏矩阵:就是指一个矩阵中每一行从左向右递增,每一列从上向下递增的矩阵。杨氏矩阵的查找,就是在矩阵中查找给定元素是否存在。矩阵可以用二维数组表示。![实现过程的图解](http://img.blog.csdn.net/20160513110447486)当然我们以左下角为起点也是可以~~(下边代码有给出,可以自己根据我分析右上角是起点的过程来分析)下边给出代码实现#define _CR原创 2016-05-13 11:17:56 · 653 阅读 · 0 评论 -
剑指offer-----将一个字符串转换成对应的整数(模拟atoi)
题目:给定字符串,将其转换成相应的整数。比如“12345”转换后就是12345.当一看到题目,我就在纸上写了如下代码:int my_atoi(const char *str){ assert(str); int i = 0; int flag = 1; int num = 0; while (*str) { if (*str == '+') { flag =原创 2016-05-22 00:33:33 · 1254 阅读 · 0 评论 -
剑指offer----替换空格
在"we are happy"这个字符串中,将所有的空格替换成字符串%20。分析:当看到这个题目时,我们就会想着遍历字符串嘛,遇到空格替换成%20,可是空格只有一个字节,%20是3个字节,明显是不够的,所以我们遇到把字符串整体后移(字符串只能存放在数组中),这样,空格越多,后边的字符移动的次数也越多。(记住:移动的时候一定要移动\0)这样,如果我们一次移动到位,这样是不是好一点呢??原创 2016-05-11 22:56:11 · 602 阅读 · 0 评论 -
剑指offer---不使用循环条件判断等实现求和
题目描述:求1+2+3+....+n,要求不使用乘除法,for,while,if,else,switch,case等关键字及三目表达式。题目分析:由于不能使用条件判断的关键字,所以,一般的递归也是不允许的,因为通过条件判断来确定递归是否结束。但是下边的方法有模仿递归来实现求和。方法一:构造函数由于静态成员是属于类而不属于对象,根据这一特性,来实现求和。下边给出代码:cl原创 2016-10-02 16:24:06 · 755 阅读 · 0 评论 -
【剑指offer】判断是否是对称的二叉树
对于一棵二叉树,如何判断这棵二叉树是否是对称的二叉树?例如:从以上的图中我们可以看出,关于根节点左右对称的二叉树就是对称的二叉树,那么在程序中我们需要如何判断呢?在二叉树的先序遍历中,先访问根结点,再访问左子树,再访问右子树。如果是对称的二叉树,那么它的左右子树应该是一样的,也就是先访问根,再访问右子树,最后访问左子树得到的结果应该是一样的。对于上图中的第一幅图,原创 2016-12-24 11:07:16 · 1085 阅读 · 0 评论 -
【剑指offer】面试题31-连续子数组的最大和问题
题目描述:输入一个整形数组,数组中有正数也有负数。数组中一个或多个连续的整数组成一个子数组,求所有子数组和的最大值,时间复杂度为O(N)。题目分析:对于这道题目,我们大多数人一下子就可以想到:我可以列出一个数组的所有的子数组,然后求和,选出最大的和就是需要的结果。如果这样做的话,子数组的个数就是n(n+1)/2(n为数组的长度).并且求子数组的和的复杂度也不是O(1),所以这样的方法的时间复杂度一定原创 2017-01-16 13:32:21 · 769 阅读 · 0 评论