DayDayUp
观赏
github:https://github.com/happyxiaotao
展开
-
17_7_20:元素入栈出栈的合法性检测
题目描述: 元素出栈、入栈顺序的合法性。如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),则合法。 入栈的序列(1,2,3,4,5),出栈序列为(4,5,2,3,1),则不合法。难点分析: 在出栈、入栈操作随机性比较强,不好把握它们的动态变换。 但是,要牢记栈的性质“后进先出”。第一个出栈的元素,肯定是当时栈空间中元素中最后进入的。即使,后来又有新的元素入栈,但是我们知原创 2017-07-20 13:51:03 · 358 阅读 · 0 评论 -
17_7_13:合并两个有序链表。实现1+2+3+...+n,不使用常规方法
1.【基础题】–合并两个有序链表,合并以后的链表依旧有序。 2.【附加题】–实现1+2+3…+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。(这个题有多种解法,大家可以尽量去思考,这个题最优的解法时间复杂度是O(1),大家可以去尝试实现)1,基础题:#include <stdio.h>typedef struct ListNode{ int _val; struct原创 2017-07-13 06:24:54 · 389 阅读 · 0 评论 -
17_7_14:逆置单链表+查找单链表的倒数第K个节点+非常规方法实现Add函数
1.【基础题】–逆置/反转单链表+查找单链表的倒数第k个节点,要求只能遍历一次链表 2.【附加题】–实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、–等等**1,基础题:**/*注:本次代码处理的是不带环的单链表*/#include <stdio.h>#include <stdlib.h>typedef struct ListNode{原创 2017-07-14 20:39:12 · 388 阅读 · 0 评论 -
17_7_15:判断链表是否有环+求环的长度+求环的入口。设计不能被继承的类,只能堆/栈上创建对象的类
1.【基础题】–判断链表是否带环?若带环求环的长度?若带环求环的入口点?并计算以上每个问题的时间复杂度? 2.【附加题】–1.设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象。 ps:以上三个问题是类似的。**1,基础题** 这个三个问题,都是处理单链表中存在环的情况。难度依次递增。(1)判断链表是否带环。 思路:定义两个指针:快指针与满指针 快指针f原创 2017-07-15 07:11:45 · 330 阅读 · 0 评论 -
17_7_16:判断两个链表是否相交,若相交,求交点。如果链表带环呢?
1.【基础题】–1.判断两个链表是否相交,若相交,求交点。(假设链表不带环)2.判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】 2.【附加题】–请问下面的程序一共输出多少个“-”? #include <stdio.h>#include <unistd.h>int main(void) { int i; for(i=0; i<2; i++){ fork(); prin原创 2017-07-16 23:52:12 · 506 阅读 · 0 评论 -
二维数组中的查找
题目描述: 一个m*n的矩阵,从左到右从上到下都是递增的,给一个数x,判断x是否在矩阵中。要求效率尽可能的高。难点分析: 一遍情况下,我们在二维数组中查找某一个元素,都是将数组遍历一遍。此时时间复杂度为O(M+N) 但是,本题中的二维数组的情况比较特殊。从左到右递增,从上到下递增,而且要求效率尽可能高。提示可以利用此规律,进行较快的查找。思路: 根据题意,知道,二维矩阵中,某一行最大数在最左原创 2017-07-27 00:06:15 · 363 阅读 · 2 评论 -
求链表A与链表B的差集
题目描述: 已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。 链表结点的结构类型定义如下: struct node { int elem; node* next; };原创 2017-07-27 02:30:28 · 1760 阅读 · 1 评论 -
判断一颗二叉树是是否是另一颗树的子树。
题目描述:.判断一颗二叉树是是否是另一颗树的子树。比如tree2是tree1的子树。 **难点分析: 要判断树2是否是树1中的节点,就需要遍历树1中节点与树2根结点比较。如果相同,则树1,树2同时遍历比较。两棵树进行两层遍历,对于技巧要求较高。思路: 将过程分为两步: 1,通过递归,在树1中每次给出一个节点。 2,通过递归,在树2中判断该结点所在树是否与树2一样。实现代码://节点信息:s原创 2017-07-29 00:06:50 · 743 阅读 · 1 评论 -
判断字符串中有无重复字符,不使用额外的数据结构
CareerCup一道题。原题:Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures?additional data structures我的理解是指自己再定义的数据结构。在这里考虑用数组、bitset原创 2017-08-16 04:59:59 · 945 阅读 · 0 评论 -
17_7_19:实现一个栈要求实现入栈、出栈、获得最小值的时间复杂度为O(1)
问题描述: 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1) 。难点分析: 首先,我们知道,在栈的实现中,入栈、出栈操作的时间复杂度都是O(1)。 难就难在返回最小值的操作的时间复杂度。如果有一个值来存储的话,到时可以,但是,当有入栈,出栈操作时,这个最小值是不断变换着的。 所以,难点可以看成是:最小值如何存储,才能满足栈中元素原创 2017-07-19 23:58:52 · 1270 阅读 · 0 评论 -
链表只翻转一部分
题目描述: 链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现Node* RotateList(Node* list, size_t k). (提示:这个题是链表逆置的升级变型)难点分析: 在原来链表逆置的基础上添加了k作为新的限制条件而已。思路:原创 2017-07-24 00:54:48 · 417 阅读 · 0 评论 -
17_7_20:计算一个整数二进制位中1的个数。
题目描述: 计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。难点分析: 如果,要判断每个位上的0或1。利用移位,然后和1相与,循环16次或32次或64次等等,这样不管正负,效率也还可以。 但是,题目要求效率尽可能的高。这样的话,就值得深思了。 关于效率问题。还得看位运算了。思路: 把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0原创 2017-07-20 14:43:41 · 333 阅读 · 0 评论 -
17_7_17:删除一个无头单链表的非尾节点。从尾到头打印单链表
【基础题】 1.删除一个无头单链表的非尾节点 2.从尾到头打印单链表首先,给出节点信息#include <iostream>#include <cassert>typedef int DataType;typedef struct ListNode{ DataType _val; ListNode* _pNext;}Node, *PNode;1.删除一个无头单链表的非原创 2017-07-17 23:59:12 · 443 阅读 · 0 评论 -
17_7_17:复杂链表的复制
思路: 有两种解决办法: 第一种: 1,遍历一次链表,构建一条新链表,只复制_data以及_next。 2,再次遍历原来链表,获取每次遍历节点的_random,在一次循环中,再次遍历链表。获取_random指向的位置到头结点的长度。在新链表中,也指向相对位置。 时间复杂度:O(n^2)第二种: 1,遍历原来的链表,每次循环中,在旧节点后面插入一个新节点。添加的新节点的_data是它前驱节原创 2017-07-18 12:00:14 · 221 阅读 · 0 评论 -
17_7_21 二叉树的层序遍历
题目要求: 实现一颗二叉树的层序遍历难点分析: 没有要求,前序,或者中序、后序等常规一路走到底的遍历。 而是,按行从左到右遍历。第一次遇见,可能有点不适应。 需要想个办法,记录每一行应该走的顺序。 思路: 可以利用队列来实现。 1,先将根节点入队列, 2,进入循环,队首结点出队列,输出其值。 3,将其左右孩子节点入队列, 4,进行2-3循环,直到队列为空实现代码:template原创 2017-07-21 23:23:22 · 234 阅读 · 0 评论 -
17_7_18:两个栈实现一个队列。两个队列实现一个栈
题目: 1,使用两个栈实现一个队列 2,使用两个队列实现一个栈 1,使用两个栈实现一个队列思路: 根据栈的FILO性质,将数据,全部存入第一个栈中; 再将第一个栈中数据全部放入第二个栈中; 这样,将数据从第二个栈中取出时,达到了FIFO效果。template <typename T>class MyQueue{public: MyQueue() {} void原创 2017-07-18 20:01:43 · 214 阅读 · 0 评论 -
17_7_22 求二叉树叶子节点的个数/求二叉树第k层的节点个数
题目描述: 求二叉树叶子节点的个数/求二叉树第k层的节点个数思路: 这两个题目的思想类似,都是利用二叉树的自相似性,把每次传进来的节点看做是一个二叉树的根结点。将问题细化,将每个节点的状态信息返回即可。节点以及二叉树信息:template <typename T>struct BinaryTreeNode{ BinaryTreeNode(const T& data)原创 2017-07-22 22:26:44 · 787 阅读 · 0 评论 -
17_7_22 一个数组中有一个数字的次数超过了数组的一半,求出这个字符。
题目描述: 一个数组中有一个数字的次数超过了数组的一半,求出这个字符。如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2。难点分析: 如果,通过O(N)的时间复杂度,通过两层循环,求出每个字符出现次数。发现有大于数组个数一半的,那么就可以得到该字符。 但是,面试官是不希望看到这个答案的。那么就需要一些比较巧妙的办法了。思路: 思路: 如果,某个字原创 2017-07-22 23:38:15 · 338 阅读 · 0 评论 -
二叉树相关面试题汇总
说明:本博文在以前面试题的基础上汇总了二叉树的常见面试题。二叉树中封装的功能有: void _CreateTree(Node*& pRoot, const T array[], size_t size, size_t& index, const T& invalid);//创建树 Node* _CopyBinaryTree(Node* pRoot);//拷贝树 void _Dest原创 2017-07-23 12:45:23 · 566 阅读 · 0 评论 -
判断某个字符串是否是合法IP
使用的头文件以及宏定义:#include <stdio.h> #include <string.h> // strlen()#include <assert.h> // assert()#include <ctype.h> // digit()#define FALSE 0#define TRUE 1#define BOOL int函数内容:BOOL IsVal原创 2017-09-01 02:26:03 · 1999 阅读 · 0 评论