- 博客(86)
- 资源 (4)
- 收藏
- 关注
原创 数据库学习1——基本概念和重要术语
目标掌握并区分数据,数据库,数据库管理系统和数据库系统等概念,了解数据库管理系统在数据管理上的重要作用掌握并区分数据模型,概念模型和基于DBMS的数据模型等概念掌握概念模型的建模工具E-R图掌握关系模型,明确关系模型得以流行的原因基本概念1、数据数据是数据库中存储的基本对象。数据的定义:描述事物的符号记录称为数据。2、数据库数据库是存放数据的
2015-10-18 21:48:46 1999
原创 常见排序算法总结
1、常见的数据结构排序算法总结如下:#include"iostream"using namespace std;/*一、直接插入排序基本思想:前i-1个数是有序的,将第i个数插入到合适的位置。1、设置标记temp = arr[i];2、对i进行插入排序,从j=i-1个数开始向前查找,若arr[j] > temp ,则 arr[j+1] = arr[j];直到循环
2015-10-05 17:20:19 813
原创 LeetCode_89_Gray Code 格雷码
题目描述The gray code is a binary numeral system where two successive values differ in only one bit.Given a non-negative integer n representing the total number of bits in the code, print the sequen
2015-09-06 22:55:24 814
原创 计算机网络之——DNS域名系统
1、什么是域名解析系统?域名系统DNS(Domain Name System) 是因特网的命名系统,用来将主机的名字转换为IP地址。2、为什么要用域名系统?因为人们更倾向于记忆主机名字,而不愿意记住IP地址。所以,用主机名字来记忆某个主机,而不是记住该主机的ip地址。而对于机器来讲,计算机的IP地址是固定长度32位(IPv6是128位),便于机器进行处理;而域名长度不一,机
2015-09-04 16:21:17 1160
原创 面试题_64——数据流中的中位数
题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。解题思路:数据流证明是输入数据大小是动态变化的。我们要从动态变化的数据流中找现有数据的中位数。首先需要考虑,这些数据流中的数据该怎么存储?即 用什么数据结构进行存储? 从而
2015-09-03 17:18:23 919
原创 linux socket网络编程详解
一、系统调用和应用编程接口在讨论网络通信之前,首先明确两个概念:系统调用(system call) 和 应用编程接口(Application Programming Interface,API)。操作系统使用 系统调用 机制来实现 在应用程序 与 操作系统 之间进行控制权传递。当某个应用进程启动了系统调用时,控制权就从应用程序传递给操作系统。操作系统执行某个内部
2015-08-27 23:45:10 1557
原创 linux进程环境及进程属性
进程是linux下资源管理的基本单元,每个进程有自己独立的运行空间。每个进程都有一个独立的进程控制块(PCB)来管理每个进程资源。进程的资源分为两大部分:内核空间进程资源 和 用户空间进程资源。其中,内核空间进程资源是指:PCB相关信息,即进程PID、PPID、UID等,包括进程控制块本身、打开的文件表项等等。简而言之,就是内核通过PCB可以访问到的资源。用户空间进程资源是
2015-08-25 21:12:29 2449
原创 面试题54——表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。解题思路:这道题没什么别的技巧,按照数值的表示规则,逐个扫描字符串,看是否符合要求。数值有如下几种情况:1、
2015-08-19 09:56:54 919
原创 同步与异步的区别
多进程多线程系统中同步与异步的区别:1、同步:当一个进程在执行某个请求的时候,请求的信息需要等一段时间才能够返回,那么该进程就一直等待,直到请求的信息返回。2、异步:当一个进程在执行某个请求的时候,不必等待请求信息的返回,直接执行接下来的操作。不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。简单来说:同步需要等待,异步不需要等待
2015-08-15 15:23:01 956
原创 面试题_53——正则表达式匹配
题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配解题思路从左到右,逐个匹配判断:1、若*(pattern
2015-08-13 09:27:35 1691
原创 C/C++知识要点6——定义只能在堆/栈上生成对象的类
在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;区别:静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数。动态建立类对象,是使用new运算符将对象建立在堆空间中。这个过程分为两步,第一步是执
2015-08-11 09:32:54 1293
原创 LintCode_138——子数组和为零
题目:给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置。样例给出[-3, 1, 2, -3, 4],返回[0, 2] 或者 [1, 3].解题思路:依次求数组的前缀和,同时执行如下操作:假定当前位置是i,查找i之前位置的前缀和,是否存在j位置,使得,j位置的前缀和 等于 i位置的前缀和。若有,则j 到
2015-08-10 17:30:28 3278
原创 C/C++知识要点5——智能指针原理及自定义实现
智能指针概述:智能指针用来管理动态对象。其行为类似于常规指针,重要的区别是:它负责自动释放所指向的对象。C++ 11标准库提供两种智能指针:shared_ptr、unique_ptr区别是:shared_ptr允许多个指针指向同一个对象;unique_ptr则独占所指向的对象。另外,还有一种weak_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象。
2015-08-10 10:51:16 2635 1
原创 C/C++知识要点4——printf函数以及cout的计算顺序
printf函数的计算顺序:先从右到左压栈,然后从左到右出栈。例程:#include"stdio.h"int main(){ int arr[] = { 1, 2, 3, 4, 5 }; int *ptr = arr; printf("%d %d\n", *ptr, *(++ptr)); return 0;}输出:2 ,2计算顺序:先计算
2015-08-07 09:33:44 1809
原创 C/C++知识要点3——类成员函数的重载、覆盖和隐藏的区别
1、类成员函数的重载:重载:如果同一作用域内的几个函数名字相同但是形参列表不同,我们称之为重载。成员函数被重载的特征:(1)相同的范围(比如在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。2、覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;
2015-08-07 09:09:25 1127
原创 C/C++知识要点2——STL中Vector、Map、Set容器的实现原理
1、Vector是顺序容器,是一个动态数组,支持随机存取、插入、删除、查找等操作,在内存中是一块连续的空间。在原有空间不够情况下自动分配空间,增加为原来的两倍。vector随机存取效率高,但是在vector插入元素,需要移动的数目多,效率低下。注意:vector动态增加大小时,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然
2015-08-06 10:40:06 5999
原创 面试题41_和为连续序列
输出描述:输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。解题思路:设置small 和 big 前后两个指针,累加small->big之间和,是否为给定和。若是,则输出;若小于,则big后移,big++; cursum += big;若大于,则small后移,cursum -= small;small++;
2015-08-04 11:29:39 626
原创 面试题40_数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路:若是数组中只有一个数字出现一次,其余的数字都出现偶数次,那么直接将数组中所有的数进行异或运算,得到的最后的结果就是出现一次的数(出现奇数次的数字)但是,题目要求是有两个数出现一次,那么上述方法得到的结果是这两个数的一个异或结果。我们可以考虑:
2015-08-04 10:58:35 756
原创 C/C++ Prime学习要点1——实现memcpy库函数
实现一个Memcpy函数。Memcpy函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域);拷贝多少个?有一个size变量控制拷贝的字节数。函数原型:void *memcpy(void *dest, void *src, unsigned int count);用法:(1)可以拷贝任何类型的对象,因为函数的参数类型是void*(未定义类型指针)
2015-08-04 09:16:23 1243
原创 面试题38_数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。解题思路数组是排序的,所以重复出现的数字是相邻排列的。用二分查找算法,找到第一次出现的位置,和 最后一次出现的位置。判断第一次出现的位置条件为:当前数字的前一个是否与之相等,若是则继续查找,否则该位置就是第一次出现的位置。判断最后一次出现的位置条件为:当前数字的后一个是否与之相等,若是则继续查找,否则该位置就是最后一次出现的位置。
2015-08-03 00:08:51 1022
原创 面试题37_两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。解题思路1、首先遍历两个链表,获得各自长度,得到长度差k2、让长的链表先走K 步3、两个链表同时向后走,同时判断是否相等,若相等则返回。时间复杂度:O(n),空间复杂度O(1)实现代码/*struct ListNode { int val; struct ListNode *next; L
2015-07-31 23:21:24 600
原创 面试题36_数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 解题思路思路一:暴力搜索,一次判断每一个数,其之后的数有没有比它小的,若有则计数加一。时间O(n^2) 思路二:利用归并排序方法,在归并的时候,计算逆序对数目。具体过程看代码。 时间O(nlogn)实现代码
2015-07-31 10:48:24 671
原创 字符串反转之——手摇算法
手摇算法(也叫三次反转算法)看题:将字符串abcdefg,变成efgabcd,要求空间复杂度O(1)。解答:第一步:将子串abcd反转,变成dcba。源字符串变成dcbaefg第二步:将字串efg反转,变成gfe。源字符串变成dcbagfe第三步:将整个字符串dcbagfe反转,变成efgabcd。手摇算法常常被用来旋转字符串。同时,手摇算法也可以用来做原地归并
2015-07-31 10:05:50 1120
原创 面试题35_第一个只出现一次的字符
题目描述在一个字符串(1解题思路思路一:暴力解法,双重循环,依次判断每个字符出现的次数,直到找到第一个只出现一次的字符。时间复杂度O(n^2)。思路二:利用hash表来存储每个元素出现的次数,时间O(n) ,空间O(1)实现代码class Solution {public: int FirstNotRepeatingChar
2015-07-31 09:41:39 521
原创 面试题34_丑数
题目描述把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解题思路思路一:从一开始,逐个判断是不是丑数,一直到找到第N个丑数。这种方法会做很多无用计算。把不是丑数的数也统统计算了一遍,会超时。思路二:可不可以只计算丑数?答案是
2015-07-31 09:36:19 648
原创 面试题33_把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路这道题是一个排序问题,但是要自定义排序规则。需要注意的问题是:拼接起来的数可能超出整型数的表示范围,因此这也是一个大数问题。用字符串来表示解决溢出问题。实现代码c
2015-07-30 23:04:04 721
原创 面试题31——连续子数组的最大和
题目描述输入一个数组,有正数也有负数,求连续子数组的最大和。解题思路典型动态规划设f(i) 表示 以i位置结尾的子数组和,那么有:递推式:f(i) = max{ f(i-1) + array[i], array[i] }初值:f(0) = array[0]实现代码class Solution {public: int Find
2015-07-29 14:30:18 707
原创 面试题30——最小的k个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。解题思路思路1:按递增排序,然后输出前k个数,简单粗暴,时间复杂度O(nlogn)思路2:利用partition算法,找到第K大数,输出其左边K个数,时间复杂度O(n)思路3:开一个规模为K的数组,遍历原数组,若辅助数组未存满K个数,那么直接将遍历
2015-07-29 13:57:26 716
原创 面试题29_数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。解题思路出现超过一半的数,一定是排好序的数组的中位数,即位置为 n/2 的数。找到这个中位数,然后,遍历一次,判断是否出现次数超过一半,若是,则返回true,否则,没有这
2015-07-29 09:21:53 1085
原创 面试题_28——字符串的全排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 解题思路这个题目就是求字符串的全排列,C++ STL有一个函数next_permutation() 可以求的字典序下一个排列。因此,利用该STL函数可以很方便就求出答案。如果要自己实现
2015-07-28 21:35:37 581
原创 面试题27_二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路采用中序遍历方法,注意指针指向。left指向小于当前值的数,right指向大于当前值的数。利用pLast来指向当前转换好的链表的最大值,即最后一个节点。首先转换左子树,其次,连接上根节点,之后,转换右子树。实现
2015-07-28 21:13:28 587
原创 面试题26_带随机指针的链表复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。解题思路思路一:分两步:第一步,遍历一遍链表,挨个复制;O(n)第二步,遍历链表,挨个找随机指针,因为定位随机指针要从头开始,所以每一个节点的随机指针都要从头开始找;时间复杂度是:O(n^2)思路二:分三步:第一步:挨个复制,链接在原
2015-07-28 20:31:27 955
原创 面试题25_二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解题思路当用先序遍历的方式访问某一结点时候,我们把该结点加入到当前路径,并计算累加和。若累加和刚好等于输入的整数,并且该节点为叶子节点,那么当前路径符合要求。如果当前节点不是叶子节点,那么继续访问它的子节点。当前
2015-07-28 13:53:04 941
原创 面试题24_二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路首先明确基本概念,什么是二叉搜索树?二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小
2015-07-27 21:07:06 777
原创 面试题23_从上往下打印二叉树
题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路:这道题考查二叉树的层次遍历。对于二叉树的先序遍历、中序遍历、后续遍历,我们都比较熟悉,用递归方法实现,代码也非常简单。对于层次遍历,我们在实现的时候,需要借助一个队列来辅助。依次将层次遍历的到的节点压入队列,再从队列中依次取出来打印。实现代码:/*struct TreeNod
2015-07-27 20:19:22 635
原创 面试题22_栈的压入和弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。解题思路:这道题考查对数据结构中栈的理解只有充分理解了栈的特性,才能够写出准确无误的代码。两个
2015-07-27 19:57:07 650
原创 面试题19_二叉树的镜像——剑指offer系列
题目描述:请完成一个函数,输入一个二叉树,该函数输出它的镜像。解题思路:二叉树的镜像,其实是一个二叉树的遍历,并且交换非叶子节点的 所有左右子节点。实现代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : v
2015-07-25 15:09:12 740
原创 面试题10_二进制中1的个数
题目描述:请实现一个函数,输入一个整数,输出该整数中二进制表示中1的个数。例如,把9表示成二进制是1001,有2位是1。因此,若输入9,输出2。解题思路:思路1、右移输入的整数n,判断最右边是否是1,若是,则计数加一,直到n为0,这种思路对于正整数可行,但是对于负数,则会进入死循环。因为,负数右移,最高位补1 而不是0因此,这种方法不可取。思路2、左移数
2015-07-25 11:29:37 788
原创 面试题09_斐波那契数列及其变种详解——剑指offer系列
题目描述:写一个函数,输入n,求斐波那契数列的第n项。解题思路:这个题目很经典,但是要写好分析好与其相关的题目也不容易。后面介绍两个变形题目。思路1:递归递归的优点就是易于理解,代码简单。缺点就是,执行速度慢,有大量重复计算,容易造成栈溢出思路2:迭代迭代方方法是用空间换时间,速度比递归快。通常情况下代码要长一点。思路3:公式法
2015-07-25 10:57:48 2263
原创 面试题08_旋转数组的最小数字——剑指offer系列
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如:数组{3, 4, 5, 1 , 2} 是 数组{1,2,3,4,5}的一个旋转,该数组最小的数是1.我们要做的就是找到这个旋转后数组的最小数。解题思路:思路1:直接遍历数组,找到最小的数,简单粗暴,时间复杂度O(n),空间复杂度O(
2015-07-25 10:28:32 1065
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人