剑指offer自学系列(五)】的更多相关文章

题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出前六个字符"google"时,第一个只出现一次的字符是"l" class Solution { public: void Insert(char ch) { s += ch; hash[ch]++; } char FirstAppearingOnce() { ; i &…
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变,例如{5,1,4,2,7,0,6,9},结果为{5,1,7,9,4,2,0,6} 题目分析: 题目要求分开奇数和偶数,还需要保持奇数和偶数相对顺序不变,首先想到的是采用两个额外数组分别存奇数和偶数,然后将两个额外数组按奇数在前,偶数在后连接到一起,但是由于未知奇数和偶数的数量,我们申请的两个额外数组为保险起见都设为和原…
题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内,数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次,请找出数组中任一个重复的数字,例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应输出的第一个重复的数字为2 题目分析: 如果我们采用两个变量去找重复的值,需要嵌套两个循环,最坏的情况是,末尾的两个值是重复的,这显然不是我们想要的答案,如果采用排序的方式得到有序数组,然后从头到尾检索,很容易就能找到第一个重复的值,排序我们采用快速排序,…
题目描述: 输入一个正整数数组,把数组里面所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个,例如输入数组{3,32,321},输出的最小数字为321323 题目分析: 如果采用穷举法,把每一种可能都列举一遍,然后比较得到最小的一个字符串,那么将会有n的全排列个组合,也就是n的阶乘种情况,当n值很大时,时间复杂度是爆炸的,所以我们需要采用一种更小的方法,首先我们知道这样一个规律,对于字符串连接(+表示连接),如果A+B<B+A,则A<B,如果A+B>B+A,则A>B,如…
题目描述:输入n个整数,找出其中最小的k个数,例如,输入{4,5,1,6,2,7,3,8}这8个数字,最小的4个数字是1,2,3,4 题目分析:首先我能想到的是先对数组排序,从小到大,然后直接输出想要的最小的k个点,而根据排序算法,表现的比较好的快速排序时间复杂度为o(nlogn),但是有没有时间复杂度更小的呢?在快速排序中,我们写过一个partition函数,它的作用是将比基准值小的放到数组前面,大的放到数组后面,如果小的那部分长度不满足我们要求的k值,我们通过左移或者右移知道找到我们想要的k…
本篇延续上一篇剑指offer题目系列二,介绍<剑指offer>第二版中的四个题目:O(1)时间内删除链表结点.链表中倒数第k个结点.反转链表.合并两个排序的链表.同样,这些题目并非严格按照书中的顺序展示的,而是按自己学习的顺序,每个题目包含了分析和代码. 9.O(1)时间内删除链表结点 题目: 在O(1)时间内删除链表结点.给定单链表的头指针和一个结点指针,定义一个方法在O(1)时间内删除该结点. 单链表的定义如下: 解答: 单向链表删除一个结点,最直观的想法是从链表的头结点开始顺序遍历查找要…
一.题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 二.思路 方法一: 看到这个题目,我们的第一反应是顺序扫描整个数组.没扫描到一个数组的时候,逐个比较该数字和它后面的数字的大小.如果后面的数字比它小,则这两个数字就组成了一个逆序对.假设数组中含有n个数字.由于每个数字都要和O(n)这个数字比较,因此这个算法的时间复杂度为O(n^2).…
本篇延续上一篇,介绍<剑指offer>第二版中的四个题目:从尾到头打印链表.用两个栈实现队列.旋转数组的最小数字.二进制中1的个数. 5.从尾到头打印链表 题目:输入一个链表的头结点,从尾到头反过来打印出每个节点的值.        链表节点定义的类如下:        解答:这里提供两种方式:用栈和递归.        第一种方式,用栈.因为单向链表一般在表头插入一个新元素,最早插入的会在链表表尾,新插入的会在链表表头.如果是从头到尾(正向)打印一个链表会很容易,直接从头结点开始一步步往表尾…
本篇介绍<剑指offer>第二版中的四个题目:找出数组中重复的数字.二维数组中的查找.替换字符串中的空格.计算斐波那契数列第n项. 这些题目并非严格按照书中的顺序展示的,而是按自己学习的顺序,每个题目包含了分析和代码,代码都是用Java语言编写的. 1.找出数组中重复的数字 题目:        在一个长度为n的数组里,所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复了几次,请找出数组中任意一个重复的数字.例如,如果输入长度为7的数组{2,3…
五十一.数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数.例如,在数组{7, 5, 6, 4}中,一共存在5个逆序对,分别是(7, 6).(7, 5).(7, 4).(6, 4)和(5, 4). 提示:本题可以使用归并排序来完成,其时间复杂度为O(nlogn),但需要一个长度为n的辅助数组. 五十二.两个链表的第一个公共节点 题目:输入两个链表,找出它们的第一个公共节点. 提示:假设两个链表的长度分别…