数据结构与算法
文章平均质量分 85
jtlyuan
这个作者很懒,什么都没留下…
展开
-
单向链表
单向链表:数据类型可以是任意类型/* * 节点类,包括数据域和指针域 */public class ListNode {public ListNode Next; //指向下一节点的指针与域public int dataValue; //数据域public ListNode(int NewValue){ dataValue=NewValue;原创 2012-01-07 15:04:11 · 402 阅读 · 0 评论 -
二叉树Java实现
有点像堆package com.jtlyuan;class BinaryTreeNode {原创 2012-03-11 13:10:22 · 343 阅读 · 0 评论 -
编程之美--------买票找零
转载于:http://hi.baidu.com/mortz/blog/item/0aa9bca4bf2f3cd47dd92ad1.html在一场激烈的足球比赛开始之前,售票工作正在紧张的进行中。每张球票为50元。现有2n个人在买票。其中n个人手持50元的钞票,另外n个人手持100元的钞票。假设开始售票的时,售票处没有零钱。问这2n个人有多少种排队方式,不使售票处出现找不到零钱的局面转载 2012-04-07 13:52:30 · 1547 阅读 · 0 评论 -
2012腾讯实习招聘笔试附加题1求解方法
附加题1:问题描述大致如下:一个数组a[n],求构造出一个b[n],使得b[i]=a[0]*a[1]*...a[n-1]/a[i];不能用除法,除了循环变量外 不能用额外的变量 ,要求O(1)的空间复杂度,O(n)的时间复杂度。首先我对题目是有点疑问的:题目所说的O(1)的空间复杂度,那么意思是:1、b数组占用的空间是原来a的空间?2、还是b另外申请一个数组空间,而不用包括在O(1原创 2012-04-07 19:50:33 · 2471 阅读 · 6 评论 -
2012腾讯实习笔试中看到的Catalan数
卡特兰数:规定C0=1,而C1=1,C2=2,C3=5,C4=14,C5=42,C6=132,C7=429,C8=1430,C9=4862,C10=16796,C11=58786,C12=208012,C13=742900,C14=2674440,C15=9694845·········································卡塔兰数的一般项公式为原创 2012-04-09 13:30:45 · 14867 阅读 · 4 评论 -
图
图:图(Graph)是由定点的有穷非空集合和定点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中的顶点的集合,E是图G中边的集合。图的两个重要的存储方式:1、 邻接矩阵:/**************图数据结构***********************/#define VERTEX_MAX 26 //图的最大顶点数 #d原创 2012-03-21 23:11:05 · 578 阅读 · 0 评论 -
再看动态规划实现:Warshall算法+Floyd算法
Warshall算法:问题:搭桥找路径:选取一个顶点作为桥梁,考察所有顶点,是否可以通过桥梁到达其它的顶点。代码实现如下:package com.jtlyuan;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.原创 2012-04-25 21:03:30 · 1503 阅读 · 0 评论 -
0/1背包问题----动态规划实现
0/1背包问题:由于前段时间研究了动态规划,今天就利用动态规划来分析及解决0/1背包问题!问题描述:一个旅行者有一个最多能用M公斤的背包,现在有N件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为v1,v2,...,vn.若每种物品只有一件求旅行者能获得最大总价值?问题分析:问题求的是最大的价值,我们定义f[i,j]表示前i种物体放进容量为j的背包里面获原创 2012-04-15 16:11:52 · 1532 阅读 · 0 评论 -
看每日微软面试题之若个题的思路总结
参考:http://blog.csdn.net/column/details/interviewms.html本文是参考每日微软面试题系列资料来完成的。1、题:.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。分析:首先54张牌分别用0到53 的数值表示并存储在一个整形数组里,数组下标代表纸牌所在的位置。接下来,遍历整个数组,在遍历过程中随机产生一个随机数,并以该原创 2012-04-16 22:13:56 · 942 阅读 · 0 评论 -
找出数组中唯一出现两次的数
转载于:http://blog.csdn.net/zhanxinhang/article/details/6710285假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那转载 2012-04-16 22:06:10 · 1653 阅读 · 0 评论 -
求一个矩阵中最大的二维子矩阵(元素和最大)
转载:http://blog.csdn.net/zhanxinhang/article/details/6731134题:求一个矩阵中最大的n==2的二维子矩阵(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是: 4 5转载 2012-04-16 22:08:31 · 12659 阅读 · 2 评论 -
编程之美---分层遍历二叉树
解法1:利用一个队列先把跟结点进队中,然后进入一个循环体,在循环体中先出队打印当前队头,然后判断是否存在左儿子,有的话进队,同样对右儿子做同样的操作,在整个循环体中结束条件是队列为空。(当这样打印出来的是一行,不能清晰的表现出层次)void PrintBFS(Node* root) { queue Q; Q.push(root); d原创 2012-04-16 21:32:36 · 687 阅读 · 0 评论 -
链表的常见智力题
收集了一下链表常见的面试题:1、如何判断一个单链表有环2、如何判断一个环的入口点在哪里3、如何知道环的长度4、如何知道两个单链表(无环)是否相交5、如果两个单链表(无环)相交,如何知道它们相交的第一个节点是什么6、如何知道两个单链表(可能有环)是否相交7、如果两个单链表(有环)相交,如何知道它们相交的第一个节点是什么1、采用快慢步长法。令两个指针p和q分别指原创 2012-07-17 23:58:00 · 1462 阅读 · 0 评论 -
《算法导论》中动态规划习题15-6--在棋盘上移动
问题描述:假设有一张n*n个方格的棋盘以及一个棋子,必须根据以下的规则把棋子从棋盘的底边移动到棋盘的顶边,在每一步你可以把棋子移动到三个方格中的一个:1、正上方的方格。2、左上方的方格(只能当这个棋子不在最左列的时候)3、右上方的方格(只能当这个棋子不在最右列的时候)每次从方格x移动到方格y,会得到p(x,y)块钱。已知所有(x,y)的p(x,y),只要从x到y的移动是合法的。不要原创 2012-07-18 14:54:02 · 7030 阅读 · 0 评论 -
求图的最小生成树之--Prim算法实现
void Prim(int G[][4],int n){ int min,i,j,k; int adjvex[n]; /*adjvex[i]=k表示第i个顶点vi与已加入最小生成树的所有点中的第k个顶点vk,合成的边(k,j)的权值是最小的*/ int lowcost[n]; /*lowcost[i]=X表示i个顶点vi与已加入最小生成树的所有点中边最小的权原创 2012-07-19 00:53:41 · 1457 阅读 · 0 评论 -
编程之美:计算两个字符串的相似度---动态规划实现
问题描述:把两个字符串变成相同的基本操作定义如下:1. 修改一个字符(如把 a 变成 b)2. 增加一个字符 (如 abed 变成 abedd)3. 删除一个字符(如 jackbllog 变成 jackblog)针对于 jackbllog到jackblog 只需要删除一个或增加一个 l 就可以把两个字符串变为相同。把这种操作需要的次数定义为两个字符串的距原创 2012-04-12 22:48:21 · 8322 阅读 · 1 评论 -
回溯法解决百度、迅雷、中兴等类似笔试题
本文章主要介绍了循环里嵌入递归的应用:以百度、迅雷、中兴等相关笔试题举例子百度2011年:求一个全排列函数:如p([1,2,3])输出:[123]、[132]、[213]、[231]、[321]、[323]求一个组合函数如p([1,2,3])输出:[1]、[2]、[3]、[1,2]、[2,3]、[1,3]、[1,2,3]这两问可以用伪代码。求1-N所有的排列:原创 2012-03-28 22:33:13 · 1791 阅读 · 0 评论 -
基本排序算法(冒择入希快归堆)Java实现
public class Sort {/******************* 冒泡排序 ************************冒泡排序法的基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键字的次序与排序要求的规则不符时,就将这两个记录进行交换。这样,关键字较小的记录将逐渐从后面向前面移动,就象气泡在水中向上浮一样,所以该算法也称为气泡排序法。原创 2012-03-17 09:41:49 · 2246 阅读 · 0 评论 -
有趣的数学问题(约瑟夫环+百钱买百鸡+阶梯数+背包问题+欧几里德算法)
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列#include #include #define N 41 #define M 3 int main(){原创 2012-04-06 20:59:05 · 1745 阅读 · 1 评论 -
河内搭问题
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Hanoi {public void move(int n,char a,char b,char c){if(n==1){System.out.println("盘"+n原创 2012-03-19 14:07:00 · 822 阅读 · 0 评论 -
双向链表
双向链表:一个数据域,两个指针域/* * 双向链表的数据结构 */public class ListNode {public ListNode Previous; //前节点public ListNode Next; //后节点public int Value; //值public ListNode(int NewValue){ Va原创 2012-01-07 15:05:02 · 472 阅读 · 0 评论 -
【轻松学排序算法】眼睛直观感受几种常用排序算法
1 快速排序介绍: 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二转载 2012-01-07 15:07:36 · 594 阅读 · 0 评论 -
递推算法
数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的。往往是在发展一种算法的时候,构建了适合于这种算法的数据结构。一种数据结构如果脱离了算法,也就没有存在的价值了。算法的作用----解决任何一个实际问题,都不可避免地涉及到算法的问题,例如本章开头提到的存钱问题,再如节假日公司值班人员的排班等,都需要通过一定的算法,得到一个最优(或较优)的方案。 递推算法使用“步步为营”的方法原创 2012-01-08 14:06:33 · 3467 阅读 · 0 评论 -
递归算法--进制数实现
递归算法,就是一种直接或者间接地调用自身的算法。递归算法的具体实现过程一般通过函数或子过程来完成,在函数或子过程的内部,编写代码直接或者间接地调用自己,即可完成递归操作。 /* * 十进制n转换为b进制 */public class Conversion { public void conversion(StringBuffer str,int n,int b){原创 2012-01-08 15:57:22 · 977 阅读 · 0 评论 -
队列和栈
队列是一种特殊的线性表,只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。当队列中没有元素时,称为空队列。对于队列这种结构,其操作很简单,主要有以下几种:初始化队列:创建一个队列。进队列:将一个元素添加到队尾(相当于到队列最后排队等候)。出队列:将队头的元素取出,同时删除该元素,使后一个元素成为队头。获取队列第1个元素:原创 2012-01-08 20:38:15 · 444 阅读 · 0 评论 -
枚举(穷举)算法
枚举(穷举)算法枚举法的本质就是确定各个变量的范围去搜索,根据等式成立条件一一判断找出正确的解,使用该算法需要满足两个条件:(1)可预先确定候选答案的数量;(2)候选答案的范围在求解之前必须有一个确定的集合。填数游戏题: 分析:算和题的数字范围只能是1-9,其他的数字范围是0-9;一一枚举出来验证答案是否正确;package jtlyuan.iteye.com;原创 2012-01-08 14:38:37 · 955 阅读 · 0 评论 -
分治算法
算法思路 使用分治法设计程序时,一般可按以下步骤进行:(1)分解:将要求解的问题划分成若干规模较小的同类问题;(2)求解:当子问题划分得足够小时,用较简单的方法解决;(3)合并:按求解问题的要求,将子问题的解逐层合并,即可构成最终的解。分而治之方法与软件设计的模块化方法非常相似。小问题通常与原问题相似,可以递归地使用分而治之策略来解决。原创 2012-01-08 19:46:43 · 433 阅读 · 0 评论 -
贪婪算法
贪婪算法基本思路:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快地求得更好的解。当达到算法中的某一步不能再继续前进时,就停止算法,给出近似解。由贪婪算法的特点和思路可看出,该算法存在以下问题:1、不能保证最后的解是最优的;2、不能用来求最大或最小解问题;3、只能求满足某些约束条件的可行解的范围。 实例:换零钱 人民币有100、50、10、5、2、1、0.5、0.原创 2012-01-08 19:47:39 · 1095 阅读 · 0 评论 -
编程之美---只考加法的面试题
问题1. 写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式;问题2. 例如32就找不到这样的表达,这样的数字有什么规律?问题3. 在64位正整数中,子序列数目最多的是哪一个?能否用数学知识推导出来?问题一解法:package com.jtlyuan.plus;/**思路: * 求解从m+(m+1)+...+n=sum; * 所以我们原创 2012-03-06 12:23:33 · 835 阅读 · 0 评论 -
编程艺术第十六~第二十章:全排列/跳台阶/奇偶调序/第一个只出现一次的字符,及一致性hash算法
第十六~第二十章:全排列,跳台阶,奇偶排序,第一个只出现一次等问题作者:July、2011.10.16。出处:http://blog.csdn.net/v_JULY_v。引言 最近这几天闲职在家,一忙着投简历,二为准备面试而搜集整理各种面试题。故常常关注个人所建的Algorithms1-14群内朋友关于笔试,面试,宣讲会,offer,薪资的讨论以及在群内发转载 2012-03-29 09:15:13 · 1512 阅读 · 0 评论 -
程序员编程艺术(算法卷):第一章、左旋转字符串
转载yu:http://blog.csdn.net/v_july_v/article/details/6322882第一节、左旋转字符串题目描述:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。转载 2012-03-29 16:10:40 · 574 阅读 · 0 评论 -
编程之美--快速寻找满足条件的两个数
第14题(数组):题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。1. 直接穷举,从数组中任意选取两个数,判定它们的和是否为输入的那个数字。此举复杂度为O(N^2)。很显然,原创 2012-03-31 19:11:23 · 620 阅读 · 0 评论 -
编程之美--编程判断两个链表是否相交
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针。相信,稍微有点 经验的同志,都会说到:设置两个指针p1,p2,首先p1和p2都指向head,然后p2向前走k步,这样p1和p2之间就间隔k个节点,最后p1和p2同时向前移动,直至p2走到链表末尾。struct ListNode{ char data; ListNod原创 2012-03-31 20:21:44 · 944 阅读 · 0 评论 -
Java集合框架
Java集合框架类集的概念是在JDK1.2之后正式完善的一套开发架构,基本的作用是完成一个动态的对象数组,里面的数据元素可以动态增加。注意:Java集合只能存放对象,不能存放其本数据类型,就算是放了基本数据类型也会自动进行打包,更不能存放变量。 Collection接口(重点)Collection接口是一个重要的操作接口,其中规定了一个集合的基本操作方法,此接口有2原创 2012-03-12 23:16:46 · 1679 阅读 · 0 评论 -
字符串是否包含问题
转载于:http://blog.csdn.net/v_july_v/article/details/6347454第一节、一道俩个字符串是否包含的问题 1.1、O(n*m)的轮询方法 1.2、O(mlogm)+O(nlogn)+O(m+n)的排序方法 1.3、O(n+m)的计数排序方法第二节 2.1、O(n+m)的hashtable的方法 2.2、O(n+转载 2012-03-31 17:57:01 · 857 阅读 · 0 评论 -
编程之美--求最大的k个数
1. 0、 咱们先简单的理解,要求一个序列中最小的k个数,按照惯有的思维方式,很简单,先对这个序列从小到大排序,然后输出前面的最小的k个数即可。2. 1、 至于选取什么的排序方法,我想你可能会第一时间想到快速排序,我们知道,快速排序平均所费时间为n*logn,然后再遍历序列中前k个元素输出,即可,总的时间复杂度为O(n*logn+k)=O(n*logn)。。3.原创 2012-03-31 18:57:40 · 1022 阅读 · 0 评论 -
编程之美--发帖水王
转载:http://blog.csdn.net/v_july_v/article/details/6890054第二十一~二十二章:出现次数超过一半的数字,最短摘要的生成 第一个问题来自编程之美上,Tango是微软亚洲研究院的一个试验项目,如图1所示。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大原创 2012-03-29 11:29:16 · 8065 阅读 · 0 评论 -
编程之美--求数组的子数组之和的最大值
前段子时间舍友恒恒问了我一个问题:怎样在一个数组中找到一个子数组使得各个元素之和最大,当时自己想了片刻,设置一个变量sum,就说从左边开始变量整个数组,一个个相加到sum中,发现了sumpublic class MaxSum {int maxFun(int[] a){int sum=a[0];int result = a[0];for(int i = 1;iif(sum原创 2012-03-31 19:54:51 · 665 阅读 · 2 评论