
剑指offer
qingcunsuiyue
集美貌、智慧、才华于一身的女子。
展开
-
剑指offer-----使数组中所有奇数在前,所有偶数在后,并保持相对位置不变
题目:输入一个整数数组,实现一个函数调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数的相对位置不变。思路:这个题的解法有好多种,我在这里实现了两种解法。1.快速排序的思想。ps:关于快速排序的思想,我会在后面的博客中专门介绍各大排序。 int a[]={3,5,4,2,7,8,1,6}; int n原创 2016-11-18 14:58:23 · 3457 阅读 · 0 评论 -
剑指offer----数值的整数次方
解题思考点:1.当底数为0时,在数学中无意义,结果0为1都可以,我输出了0;2.当指数为负数时,把它先转为整数,求的结果result,最后在1.0除以result,就是最终的答案。3.求数值的整数次方时,用了高效的解法,假如次方为16,如果我们已经知道了数的8次方,只要在平方就可以了,。。。以此类推,这是一个递归的函数。a^n=(a^(n/2))*(a^(n/2))=(a^(n/2原创 2017-05-16 17:17:56 · 345 阅读 · 0 评论 -
数据流的中位数
解题思路:1.用了STL中的priority_queue来保存数,max中的数从大到小,min中的数从小到大。2.要保证max-min中数差不能超过2,min-max中数差不能超过1。class Solution { priority_queue,less > max; priority_queue,greater > min;public: void In原创 2017-05-16 17:28:13 · 239 阅读 · 0 评论 -
剑指offer----字符流中第一个不重复的字符
解题思路: 1.用数组来保存字符出现的次数,数组的下标对应相应的字符。 2.用队列来保存第一次出现的字符。 3.从队列的队头开始判断,如果队头字符所对应的出现次数不为1,则删除对头,判断下一个,否则,队头的字符就是第一个不重复的字符。class Solution{public: int arr[256]; queue q; So原创 2017-05-18 00:54:55 · 241 阅读 · 0 评论 -
剑指offer---链表中倒数第k个节点
解题思路:利用前后两个指针。1、先让前指针走k步,设全场L,那么就剩余L-K步;2、前后两个指针同时走,当前指针走到链表尾,就停止,这时后指针所在的位置就是倒数第K个节点; 因为后指针走了L-K步,还剩(L-(L-K)=K)步就到链表结尾。class Solution {public: ListNode* FindKthToTail(ListNode* pListHea原创 2017-05-09 17:17:09 · 263 阅读 · 0 评论 -
剑指offer----把数组排成最小的数
题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路:1.用算法中的sort()函数,从小到大排序。 2.把两个整数拼接后,比较大小,例如:a=21,b=2,拼接有a+b和b+a两种方式,结果为212和221,而原创 2017-05-19 00:35:55 · 223 阅读 · 0 评论 -
判断两个链表是否相交,若相交,求交点
解题思路:链表相交有3种大的情况,两个链表都带环;都没带环;一个带环,一个没带环;1.两个链表都带环。2.一个链表带环,一个链表没有带环,则他们肯定不相交。3.两个链表都没带环。代码: //判断链表是否带环 Node* ListIsLoop(Node* head) { Node* solw=head; Node* fast=head; w原创 2017-07-18 11:01:21 · 291 阅读 · 0 评论 -
小米面试题-----将二叉树打印成多行
题目:将处于同一层的打印成一行。方法1:定义一个嵌套的vector(vector>),把处于同一层的保存在一个vector中。class Solution {public: vector > Print(TreeNode* pRoot) { vector> v; //特别关键 if(pRoot==NULL)原创 2017-09-22 10:25:33 · 410 阅读 · 0 评论 -
58面试题-----用两个栈实现一个队列
题目:class Solution{public: void push(int node) { stack1.push(node); } int pop() { int ret=0; if(stack1.size()==1&&stack2.size()==0) stack1.pop();原创 2017-09-22 11:00:24 · 271 阅读 · 0 评论 -
剑指offer-----删除链表中重复的 节点
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 递归的解法。class Solution {public: ListNode* deleteDuplication(ListNode* pHead) { if(pHea原创 2017-05-07 16:40:58 · 244 阅读 · 0 评论 -
剑指offer----链表中环的入口节点
题目:一个链表中包含环,找出环的入口点。1.判断链表是否带环??定义一个快指针,每次走两步;定义一个慢指针,每次走一步,如果他们相遇,就说明链表带环。2.在求环的入口点??L-a-x为快指针到入口点的距离。如公式可知:即让慢指针从链表头结点开始走,快指针不变,当他们相遇时,就是环的入口点。ListNode* EntryNodeOfLoop(ListNode* p原创 2017-04-24 01:28:32 · 277 阅读 · 0 评论 -
剑指offer------两个链表的第一个公共节点
思路:时间复杂度为O(n+a+b)当p1走了a+n步后到了链表1的尾部,让p1指向链表2,此时p2也走了a+n步,此时p2到链表尾还剩b+n-(a+n)=b-a步;p2走了b-a步后到了链表2的尾部,让p2指向链表1,此时p1也走了b-a步。当p2走了a步后到达第一个公共节点,此时p1也走了a步( (b-a)+a=b )刚好也到达第一个公共节点;如果两个链表没有公共节点原创 2017-05-04 21:09:31 · 277 阅读 · 0 评论 -
二叉树的相关面试题 <三>---------二叉树的镜像
题目:输入一个二叉树,输出它的镜像。解题思路:求树的镜像就是遍历树的同时交换非叶子节点的左右节点。前序遍历,当当前节点的左右子树节点不为空时,交换左右节点。原图为:镜像和原图对比图为:原创 2017-01-03 23:34:57 · 564 阅读 · 0 评论 -
设计一个类,只能生成该类的一个实例
只能生成一个实例的类是实现了Singleton(单例)模式的类型。解题思路:根据题目的要求,1.必须把构造函数设为私有函数,防止他人创建实例。2.在类中创建静态私有的实例,在需要时创建该实例,直到程序结束才销毁。3.提供一个静态的公有的函数用于创建/获取静态私有对象。在系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,原创 2017-01-05 23:34:49 · 4072 阅读 · 0 评论 -
二叉树的相关面试题<三>-----二叉树中和为某一的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路劲。void PrintNodeEqualInt() { int num; cout<<"输入一个整数:"<<endl; cin>>num; int sum=0; queue q; _PrintNodeEqualInt(_root,num,sum,q); }void _PrintNodeE原创 2016-12-31 21:33:11 · 694 阅读 · 0 评论 -
剑指offer---替换空格
面试题4:实现一个函数,把字符串中的每个空格替换成“%20”。思路:时间复杂为O(n),在源字符串上操作,从后往前进行替换。#include#include//替换空格--》%20#define MAX 50int main(){ char str[MAX]=" we are happy "; int len=strlen(str); //遍历一遍,求出空格的个数O(n)原创 2017-04-01 17:34:50 · 298 阅读 · 0 评论 -
剑指offer--1.删除链表中某个节点 2.从尾到头打印链表
#include#include#includestruct ListNode{ int data; struct ListNode* next;};//创建链表void CreatListNode(struct ListNode** phead, int data){ struct ListNode* pnew=malloc(sizeof(struct ListNode));原创 2017-04-02 20:08:09 · 347 阅读 · 0 评论 -
剑指offer---旋转数组的最小数字
题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}的一个旋转,该数组的最小元素为1.思路:因为旋转后该数组是两个有序的子数组,可以用二分查找来找最小的数。时间复杂度为O(logn)。void test1(){ int numbers[]={1,0,1,1,1}; int l原创 2017-04-03 18:18:52 · 286 阅读 · 0 评论 -
剑指offer----连续子数组的最大和
解题思路:根据题意,最大和的路径不定是从下标为0的开始,所以时间复杂度为O(N^2)。 max:用来保存路径上的最大和。 sum:用来保存路径上的总和。注意:max的初始值为array[0],不能为0,否则当数组中的值都为负数时,结果就不对。int FindGreatestSumOfSubArray(vecto原创 2017-04-19 09:35:55 · 274 阅读 · 0 评论 -
剑指offer----合并两个有序链表
题目:合并两个递增的有序链表。注意:测试时一定要考虑全面,当两个链表有一个或两个都为空的情况。 ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(pHead1==NULL) return pHead2; if(pHead2==NULL) r原创 2017-04-17 14:30:12 · 381 阅读 · 0 评论 -
用两队列实现一个栈
class Stack{public: void push(int data) { q1.push(data); } int pop() { int ret=0; if(!q1.empty()) { while(q1.size()>1) { int data=q1.front(); q2.push(data);原创 2017-09-22 11:33:49 · 223 阅读 · 0 评论