E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
解题笔记
解题笔记
(32)——输入一颗二元查找树,将该树转换为它的镜像
问题描述:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 8 // 610 ////57911输出: 8 // 106 ////11975 定义二元查找树的结点为:structBSTreeNode { intvalue; BSTreeNode*left; BSTreeNod
wuzhekai1985
·
2011-08-29 14:00
struct
null
解题笔记
(31)——从数列1,2...n中随意取几个数,使其和等于m
问题描述:输入两个整数n和m,从数列1,2.......n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来。 思路:这个问题其实背包问题的变形,本文给出两种解法。 解法一:用递归,效率可能低了点。假设问题的解为F(n,m),可分解为两个子问题F(n-1,m-n)和F(n-1,m)。对这两个问题递归求解,求解过程中,如果找到了符合条件的数字组合,则打印出来。 解法二:用
wuzhekai1985
·
2011-08-29 11:00
测试
delete
解题笔记
(30)——找含单链表的环入口点(转网上某位高手的解法)
原文出处 http://hi.baidu.com/iwitggwg/blog/index/1 很不错。 问题1:如何判断单链表中是否存在环(即下图中从结点E到结点R组成的环)? 设一快一慢两个指针(Node*fast,*low)同时从链表起点开始遍历,其中快指针每次移动长度为2,慢指针则为1。则若无环,开始遍历之后fast不可能与low重合,且fast或fast->next最终
wuzhekai1985
·
2011-08-27 20:00
null
解题笔记
(30)——找含单链表的环入口点
问题描述:有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。如果链表存在环,找到环的入口点? 思路:这道题的原型可能来自《C专家编程》一书,题目为”怎样才能检测到链表中存在循环“,书中给出的最终算法是定义两个指针p1,p2,p1每次移动一个位置,而p2每次移动两个位置,这样如果链表中存在循环,那么p2一定能追上p1。如果不存
wuzhekai1985
·
2011-08-27 16:00
解题笔记
(29)——珠子问题
问题描述:一串首尾相连的珠子(n个),有N种颜色(Ni)?i-j+1+n:i-j+1;//长度计算公式 if(len
wuzhekai1985
·
2011-08-27 12:00
解题笔记
(28)——寻找捣乱分子对
问题描述:多人排成一个队列,我们认为从低到高是正确的序列,但是总有部分人不遵守秩序。如果说,前面的人比后面的人高(两人身高一样认为是合适的),那么我们就认为这两个人是一对“捣乱分子”,比如说,现在存在一个序列:176,178,180,170,171 这些捣乱分子对为,,,,,,那么,现在给出一个整型序列,请找出这些捣乱分子对的个数(仅给出捣乱分子对的数目即可,不用具体的对) 思路:最
wuzhekai1985
·
2011-08-25 14:00
解题笔记
(27)——找数组中的特定元素
问题描述:一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。 思路:如果能用两个辅助数组,那么相对来说简单一点,可定义数组Min和数组Max,其中Min[i]表示自a[i]之后的最小值(包括a[i]),Max[i]表示自a[i]之前元素的最大值。有了这两个辅助数组后,对于a[i],如果它
wuzhekai1985
·
2011-08-24 21:00
null
解题笔记
(26)——排队问题
问题描述:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 思路:可以用递归来解决。假设已按高矮顺序编号从0到11,即0号最矮、11号最高,(i,j)表示某个人在队列中的位置。对于0号只能排在(0,0),1号可以排在两个位置(0,1)和(1,0)。2号可以排的位置取决于1号的位置,如果1号排在(0,1),那么2号可以排在两个位
wuzhekai1985
·
2011-08-23 11:00
解题笔记
(25)——把数组排成最小的数
问题描述:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。 思路:先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可。这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与ba。如果abba,则a>b;如
wuzhekai1985
·
2011-08-21 10:00
算法
struct
String
解题笔记
(24)——找出数组中两个只出现一次的数字(数组)
问题描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 思路:如果只有一个数字只出现一次,而其他都出现两次,则直接将所有数字做一次异或运算即可,因为相等的数字异或一下结果为0。如果有两个数字只出现一次,而其他数字出现了两次。该怎么办呢?《编程之美》一书提供了一种方法,即先将所有数字做一次异或运
wuzhekai1985
·
2011-08-20 18:00
编程
解题笔记
(23)——一个线程竞争的问题
下面这个程序存在竞争,当对等线程执行 intmyid=*((int*)argv) 前,如果主线程先执行了i++,那么对等线程的执行结果是不正确。#include #include #defineN100 void*thread(void*argv) { intmyid=*((int*)argv); printf("hellofromthread%d\n",myid); returnNU
wuzhekai1985
·
2011-08-13 22:00
JOIN
thread
null
解题笔记
(22)——n后问题
问题描述:在n×n格的棋盘上放置彼此不受攻击的n个皇后。即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。 思路:每个皇后都是放在单独的一行,因此同行就不用判断了。
wuzhekai1985
·
2011-07-29 16:00
算法
delete
解题笔记
(21)——字符串的排列组合问题
问题1:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 思路:这是个递归求解的问题。递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环;(2)子问题在规模上比原问题小;(3)子问题可通过再次递归调用求解;(4)子问题的解应能组合成整个问题的解。
wuzhekai1985
·
2011-07-29 14:00
c
算法
null
permutation
解题笔记
(20)——判断二叉树是不是平衡的
问题描述:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下图中的二叉树就是一棵平衡二叉树: 思路:对于树的题目,第一反应就是用递归。对于以某个结点为根的树,只需计算出它的左右子树的深度,如果深度相差小于等于1,则递归判断它的左右子树是不是平衡树;否则肯定不是平衡二叉树。这个问题的关键是要计算树的
wuzhekai1985
·
2011-07-29 10:00
struct
null
解题笔记
(19)——数对之差的最小值
问题描述:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2,4,1,16,7,5,11,9}中,数对之差的最大值是11,是16减去5的结果。 思路:这又是一道动态规划的题目,这是我能想到的最好方法,时间复杂度为O(n)。假设f[i]表示数组中前i+1个数的解,前i+1个数的最大值为m[i]。则有下列式子。 f[i]=max(f[i-1],m
wuzhekai1985
·
2011-07-29 09:00
解题笔记
(18)——n个骰子的点数
问题描述:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。 思路:这是一道应用动态规划思想的题目,而动态规划最难的就是要找最优子结构。并采取一种称为备忘录的方法避免重复计算。因为备忘录方法为每个解过的子问题建立了备忘录,以备需要时参看,避免了相同子问题的重复求解。 本题的最优子结构为:F(k,n)表示k个骰子点数和为n的种数,
wuzhekai1985
·
2011-07-28 12:00
解题笔记
(17)——扑克牌的顺子
问题描述:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。 思路:可以将这5张牌排个序,然后统计出0的个数以及非0数字之间的间隔数,如果出现重复的非0数字,那么不是顺子。如果间隔数小于等于0的个数,那么是顺子。暂时未想到更好的办法。 参考代码://函数功能:从扑克牌中随
wuzhekai1985
·
2011-07-28 10:00
解题笔记
(16)——几个数字的问题
个人感觉,这类题的技巧性很巧,同时需要很好的分析能力,受到各大公司的青睐。下面列举几个,这些问题网上都能找到解答,自己实现了一下,供网友参考。 问题1:整数的二进制表示中1的个数。 思路:可以有以下几种解法。(1)使用除法操作。(2)使用位操作。(3)位操作的改进。(4)如果是8位的整数,可以直接用查表法或分支操作。《编程之美》上有详尽的介绍。这里给出(2)、(3)的解法
wuzhekai1985
·
2011-07-27 22:00
编程
算法
优化
null
delete
解题笔记
(15)——几个栈和递归的问题
本文介绍了几个栈和递归的问题,当然递归的本质就是栈。这些问题网上都能找到解答,自己思考并实现了一下,供网友参考。 问题1:跳台阶问题。具体描述,一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间杂度。 思路:简单分析一下,这道题不难。假设f(n)为问题的解,从后往前推,最后一跳有两种情况,一是跳1级,二是跳2级,可以得出这个式子f(n)
wuzhekai1985
·
2011-07-26 17:00
解题笔记
(14)——几个字符串的问题
字符串问题是面试中经常出现的问题,这类问题有很多,难以不一。下面是几道字符串的题目,网上都能找到解答,自己实现了一下,供网友参考。感觉算法重要的是要有正确的思路,实现起来不是问题。自己一定要多思考,这样收获可能会更多一点。 问题1:找两个字符串的最长公共子串。 具体描述,如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注
wuzhekai1985
·
2011-07-25 21:00
解题笔记
(13)——几个链表的问题
链表的一些问题经常会在面试中出现,这类题目能很好的反映出程序员的编程基本功,以及思维的缜密程度。写代码之前,最好能仔细分析一下题目,列出关键点。其实思路是最重要的,思路如果正确,代码实现不是问题,更像是一个翻译的过程。下面是4道关于链表的题目,网上都有思路解答。自己实现了一下,供网友参考。下面各题的链表结点定义如下:structListNode { intkey; ListNode*n
wuzhekai1985
·
2011-07-25 14:00
编程
算法
struct
面试
null
delete
解题笔记
(12)——用两个栈实现队列
问题描述:用两个栈来实现队列,有如下声明:template classSQueue { public: SQueue(){} ~SQueue(){} voidPushBack(constT&x); voidPopFront(); private: stackm_stack1; stackm_stack2; }; 思路:栈是先进后出,而队列是先进先出。可以这样设计,一个栈用于入队列
wuzhekai1985
·
2011-07-24 21:00
解题笔记
(11)——字符串转换为整数
问题描述:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。 思路:转换的过程比较简单,每次读入一个字符,将之前保存的值乘以10,然后再加上这个字符表示的数字。这是正常情况。这个问题主要是考察各种不正常情况的处理。假设函数的声明为intStrToInt(constchar*str); (1)输入的字符串指针为空; (2)数字
wuzhekai1985
·
2011-07-24 16:00
c
null
float
解题笔记
(10)——约瑟夫环问题
约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。 稍微简化一下。 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的
wuzhekai1985
·
2011-07-24 10:00
算法
struct
null
delete
iterator
解题笔记
(9)——提取某日访问次数最多的那个IP(补充)
问题描述见“
解题笔记
(9)——提取某日访问次数最多的那个IP ”#pragmawarning(disable:4786)//VC6.0中忽略警告 #include #include #include
wuzhekai1985
·
2011-07-23 17:00
ios
String
File
iterator
buffer
output
解题笔记
(9)——提取某日访问次数最多的那个IP
问题描述:从海量数据日志中,提取出某日访问次数最多的那个IP。 思路:对于海量数据的处理,主要采取的策略就是分而治之,即缩减问题的规模,将一个大的问题划分成若干等价的小问题。然后解决这些小问题,最后将获得的小问题解综合起来,得出原问题的解。用到比较多的技术主要有散列、位图、堆、trie树、mapreduce、K路归并(败者树)等。其中散列用的尤为多。 对于本问题,假定某日
wuzhekai1985
·
2011-07-22 16:00
解题笔记
(7)——判断整数序列是不是二元查找树的后序遍历结果
问题描述:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / / 6 10 // // 5 79 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。 思路:分
wuzhekai1985
·
2011-07-20 14:00
解题笔记
(8)——翻转句子中单词的顺序
问题描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“Iamastudent.”,则输出“student.aamI”。 思路:先逆转整个句子,然后从首字符开始扫描,每扫描到一个单词(遇到空白或结束字符),对这个单词进行逆转。 代码://采用左闭右开的形式voidReverse(ch
wuzhekai1985
·
2011-07-20 14:00
解题笔记
(6)——在二元树中找出和为某一值的所有路径(树)
问题描述:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 // 5 12 / / 4 7则打印出两条路径:10,12和10,5,7。二元树节点的数据结构定义为:structBinaryTreeNode{intdata;BinaryTreeNode*p
wuzhekai1985
·
2011-07-19 22:00
数据结构
struct
null
iterator
Path
解题笔记
(4)——把二元查找树转变成排序的双向链表
问题描述:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 // 6 14 ////4 81216 转换成双向链表4=6=8=10=12=14=16。 思路:利用递归的思想求解,分别调整某结点的左右子树,调整完后,将该结点的左指针指向左子树的最大节点,右指针指向右子树的最小节点。 代码如下:BSTreeNode*Conve
wuzhekai1985
·
2011-07-15 20:00
解题笔记
——前言
网上有很多经典的面试题,大都出自微软、Google、百度这样的公司,很多题目都有解答。下面是两个很好的博客,一个是JULY的,另一个是何海涛的。上面有题目,也有解题思路及代码。 JULY的博客 http://blog.csdn.net/v_JULY_v/article/details/6057286 何海涛的博客 http://zhedahht.blog.163.com/
wuzhekai1985
·
2011-07-15 20:00
算法
面试
Google
百度
微软
解题笔记
(3)——随机数选择
问题:从0,1,2...n-1中随机选择m个数,每个数选中的概率要求一样,而且不允许重复。选中的数按顺序输出。比如,0,1,2,3,4,5中随机选3个数,如果选的是1,4,5,那么输出的顺序也应该是1,4,5。下面实现中,用的随机函数都是C的库函数,这个函数产生的随机数的范围是限定的,[0,32767],如果要产生更大的随机数,需另外实现随机函数,将rand()替换掉。比如下面这个函数。i
wuzhekai1985
·
2011-07-15 15:00
编程
c
算法
Random
iterator
ini
解题笔记
(1)——子数组之和的最大值
求子数组之和的最大值是一个很经典的问题。问题的描述如下:一个有N个整形数的一维数组(A[0],A[1],...A[n-1]),这个数组有很多子数组,那么子数组之和的最大值是什么呢? 这个问题的解答其实在《编程珠玑》一书有的。一共是4中方法:第一种是穷举法,计算所有可能子数组的和,时间复杂度为O(n3)。第二种其实也是穷举法。代码如下:for(i=0;imaxsum) maxsum
wuzhekai1985
·
2011-07-13 21:00
解题笔记
(2)——部分面试题解题思路
这几天在网上看到一篇关于算法面试题的博客,归纳的很好,有不少经典的题目,大部分来自《编程珠玑》、《编程之美》、《代码之美》三本书。这里给出书上的解答以及一些思考。如有不对的地方,希望得到高手的指点。【一】时间受限大部分的面试题,都是对时间复杂度有所要求的,如果有涉及,“最快”一类的字样,毫无疑问,先上时空原理,用空间来换时间。Hash,大数组,一些辅助性的空间,都是首选。在我的面试经历中,有无数次
wuzhekai1985
·
2011-07-11 15:00
编程
算法
面试
Random
扩展
解题笔记
(5)——CPU占用率固定为50%
解题思路: 要控制CPU的使用率曲线,可以让CPU跑busy和idle两个不同的循环。busy循环可以执行一个空循环,idle可以调用Sleep调用实现。 程序的关键在于设定空循环的执行次数,这与CPU的主频存在关系。假设CPU的主频为2.33GHz,CPU每个周期平均可以执行2条指令,一个空循环的指令条数为5条,那么循环次数n的计算方式为n=(2.33*1000
wuzhekai1985
·
2011-01-09 21:00
解题笔记
之 1027 简单动态规划
动态规划,和LCS有点近似,但是我用递归加结果记录解掉了,感觉这样更直观-_____- (其实是类LCS解法的那个一开始就没去考虑.......面壁一下 ) dp方程见代码,应该写的比较利索了 #include #include #include #defineINFINITE-9999 #defineMINUS4 intscore_board[5][5]={{5,-1,-2,-1,-3},
azure_sky
·
2008-07-21 16:00
C++
c
C#
J#
解题笔记
之 1009 恶心的模拟
ZJU OJ 1009 Enigma 比较晕的模拟题目,倒过来算circuit偏差值就可以,逻辑很简单,但有点绕 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 1000 #define ROTOR_COUNT 3 #define
azure_sky
·
2008-07-21 13:00
C++
c
C#
解题笔记
之 1733 简单动态规划
http://acm.zju.edu.cn/show_problem.php?pid=1733 1733, 最大子串,标准 CLS算法,动态规划 那个记录二维数组可以静态分配的,不过无所谓了,测试数据很弱 #include <stdio.h> #include <stdlib.h> #include <string
azure_sky
·
2008-07-21 12:00
算法
PHP
J#
上一页
1
2
3
4
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他