算法与数据结构
KarryChang.
三年的局点
展开
-
用栈进行括号匹配(Java)
括号匹配问题import java.util.HashMap;import java.util.Stack;/** * Created by changqing on 2017/9/2. */public class MatchJudge { public static void main(String[] args) { System.out.println...原创 2017-09-02 20:01:26 · 394 阅读 · 0 评论 -
网易笔试题:回文序列
这题想了半天也没有好的办法,上网一查,茅塞顿开,赶紧记录一下一下原文转载自:http://blog.csdn.net/zjwcdd/article/details/52673355如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如: {1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {转载 2017-03-24 01:21:25 · 439 阅读 · 0 评论 -
面试题:数组中出现次数超过一半的数字
转载自:http://blog.csdn.net/zjwcdd/article/details/52673355题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。package alex.suda.转载 2017-03-24 01:19:36 · 291 阅读 · 0 评论 -
大整数乘法
C++代码#include #include #include using namespace std;string big_number_multiply(string a, string b){ int a_len = a.length(), b_len = b.length(), len = a_len + b_len; vector c(a_len + b_len,原创 2017-03-24 00:08:53 · 213 阅读 · 0 评论 -
删除最少字符,得到回文串
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数。tips:最长公共自序列的变形,如果能想到这点的话,解决起来就不会太困难。#include#include#includeusing namespace std;const int MAX = 1001;int MaxLen[MAX][原创 2017-03-23 21:28:04 · 1720 阅读 · 0 评论 -
U盘代码总结
整理U盘发现一些以前的资料,记录一下吧43.递归和非递归俩种方法实现二叉树的前序遍历。ANSWERvoid preorderRecursive(TreeNode * node) { if (node == NULL) return; visit(node); preorderRecursive(node->left); preorderRecursive(node-原创 2017-03-28 23:50:17 · 1661 阅读 · 0 评论 -
数组分割
转载自:http://blog.csdn.net/hackbuteer1/article/details/7638305以前上算法课的时候老师说道这个问题,但是当时没有给出解答,现在去网上查了一下解法,难度还是有的,有的是动规以及0 1背包的思想原文如下:一、题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最转载 2017-03-21 22:28:16 · 177 阅读 · 0 评论 -
java 实现8种常见排序
/** * Created by changqing on 2017/3/5. */public class main { public static void main(String[] args) { int []nums={1,6,6,8,2,2,5,78,8,21,2,124,4}; QuickSort(nums,0,nums.length-1原创 2017-03-05 15:58:01 · 1107 阅读 · 0 评论 -
今日头条笔试
题目1:给定两个长度为 n 的整数数列 A 和 B。再给定 q 组查询,每次查询给出两个整数 x 和 y,求满足 Ai >= x 且 Bi >= y 这样的 i 的数量。输入第一行给定两个整数 n 和 q。第二行给定数列 A,包含 n 个整数。第三行给定数列 B,包含 n 个整数。接下来 q 行,每行两个整数 x 和 y,意义如上所述。输出对于每组查询,输出所求的下原创 2017-04-06 22:36:07 · 1988 阅读 · 0 评论 -
海量数据处理
转自:http://blog.csdn.net/v_july_v/article/details/7974418http://blog.csdn.net/v_july_v/article/details/68970975、 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?转载 2017-03-05 18:40:10 · 334 阅读 · 0 评论 -
求二叉树的高度与宽度
转载自:http://blog.csdn.net/zjwcdd/article/details/51275033一直在学习这位大牛的博客,一些算法记录一下,二叉树高度不难求,宽度就要花点心思了,这里转载一下以下原文题目描述:求二叉树的宽度和深度 给定一个二叉树,获取该二叉树的宽度和深度。 //二叉树的高度: public static int getHei转载 2017-03-24 01:36:56 · 1876 阅读 · 0 评论 -
修路问题
题目:首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块。像畅通工程这题,问还需要修几条路,实质就是求有几个连通分支。如果是1个连通分支,说明整幅图上的点都连起来了,不用再修路了;如果是2个连通分支,则只要再原创 2017-03-29 10:59:31 · 4204 阅读 · 0 评论 -
网易笔试题:合唱团
有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗? 输入描述:每个输入包含 1 个测试用例。每个测试数据的第一行包含一个整数 n (1 <= n <= 50),表示学生的个数,接下来的一行,包含 n 个整数,按顺序表示每个学生的能力值原创 2017-03-24 15:55:41 · 914 阅读 · 0 评论 -
Java统计单词频率
利用集合类,其中按照map中value排列需要考虑一下具体思路,最后结合list完成排列/** * Created by changqing on 2017/3/4. */import java.io.*;import java.util.*;public class test { public static void main(String [] args) throw原创 2017-03-05 12:17:11 · 2995 阅读 · 0 评论 -
排序选择题
一、 单项选择题(共71题)对n个元素的序列进行冒泡排序时,最少的比较次数是( )。A. n B. n-1 C. n/2 D. log2n答案:B若一个元素序列基本有序,则选用( )方法较快。A. 直接插入排序 B. 简单选择排序 C. 堆排序 D. 快速排序答案:A在对n个元素进行冒泡排序的过程中,第一趟排序至多需要进行( )对相邻元素之间的交换。A. n B. n转载 2017-05-11 08:28:04 · 31195 阅读 · 0 评论 -
RMQ算法
转载自:http://blog.csdn.net/liang5630/article/details/79177021. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j算法。当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们转载 2017-04-19 19:37:56 · 208 阅读 · 0 评论 -
职上青云笔试题
题目1:给出两个数m和n,要求给出两个数的二进制表示有多少个不同的位。tips:说来惭愧,笔试时有了想法,但是前面花了太多不必要的时间,到这题都没时间写了。现在要开始训练做题速度了,笔试时有思路是没什么用处。思路:开一个数组d[32],用1>>i来初始化所有的值,然后用m和n分别于d[i]进行&运算,如果结果不同,则计数+1代码:int countBitDiff(int原创 2017-04-06 09:30:09 · 675 阅读 · 0 评论 -
最长上升子序列总结
笔试遇到驼峰数问题,其实就是从左到右,从右到左求最长升序自序列问题,但是提交超时,经典的dp算法时间复杂度是O(n^2),上网找到使用二分查找的方法时间复杂度可以降到O(n*log(n)),以前都没注意总结,现在后悔莫及!!!赶紧记录一下,原文如下:转载自:http://blog.csdn.net/zhangyx_xyz/article/details/50949957LI转载 2017-03-26 15:53:15 · 444 阅读 · 0 评论 -
迷宫
#include#include#include#include#includeusing namespace std;int maze[10][10];int vis[10][10],dist[10][10];int dr[]={-1,1,0,0};//上,下,左,右int dc[]={0,0,-1,1};struct Node{ int r,c;//也可以在Nod转载 2017-03-26 10:17:34 · 426 阅读 · 0 评论 -
腾讯模拟考之素数对问题
题目给你一个整数n,如果可以由素数对构成,则输出素数对的个数,如10由(5,5)(3,7)构成,所以输出结果为2.tips:先找出范围内的素数,使用标记的方法,查看n-素数结果还是不是素数,如果是,则计数+1.代码#include#include#includeusing namespace std;const int maxn=10000;//flag原创 2017-03-25 17:55:03 · 423 阅读 · 0 评论 -
钓鱼问题
转载自:http://blog.csdn.net/u013480600/article/details/38062437题意: John现有h个小时的空闲时间,他打算去钓鱼。钓鱼的地方共有n个湖,所有的湖沿着一条单向路顺序排列(John每在一个湖钓完鱼后,他只能走到下一个湖继续钓),John必须从1号湖开始钓起,但是他可以在任何一个湖结束他此次钓鱼的行程。此题以5分钟作转载 2017-03-24 17:54:40 · 650 阅读 · 0 评论 -
田忌赛马问题
转载自:http://blog.csdn.net/u013480600/article/details/38067641题意: (前面一大段背景介绍…)其实就是田忌和国王各有n匹马且给出了每匹马的速度.现在进行n轮比赛,如果田忌胜1局得200银币,输一局扣200银币.问田忌最多获得多少银币.(可能为负数)分析: 首先比赛肯定是要比n局的,所以想要获得最大转载 2017-03-24 17:52:37 · 1171 阅读 · 0 评论 -
布隆过滤器
最近学校校招都来了,面试前赶紧刷刷题,过程中碰到一个白名单黑名单问题,我想到了hash,看网上讨论说布隆过滤器是个不错的选择。去找了一篇拜读,现在真心觉得数学真是很重要!得补补了转自自:http://blog.csdn.net/hguisu/article/details/78661731. Bloom-Filter算法简介 Bloom-Filter,即布转载 2017-03-04 16:11:21 · 1543 阅读 · 0 评论 -
堆排序
#define _CRT_SECURE_NO_WARNINGS#include #includeusing namespace std;void HeapAdjust(int *a, int i, int size) //调整堆 { int lchild = 2 * i; //i的左孩子节点序号 int rchild = 2 * i + 1; //i的右孩子转载 2016-11-21 10:34:35 · 404 阅读 · 0 评论 -
多处服务最优调度
最优调度算法原创 2016-11-20 17:53:29 · 559 阅读 · 0 评论 -
回溯法求N皇后问题
八皇后的问题经典的用回溯法求解案例,一下进行一些必要的分析 基本思路: 用n元组x[1;n]表示n后问题的解。其中,x[i]表示皇后i放置在棋盘的第i行的第x[i]列。由于不容许将2个皇后放在同一列上,所以解向量中的x[i]互不相同。2个皇后不能放在同一斜线上是问题的隐约束。对于一般的n后问题,这一隐约束条件可以化成显约束的形式。如果将n*n 格的棋盘看做二维方阵,其行号从上到原创 2016-11-13 22:16:23 · 838 阅读 · 0 评论 -
stringstream读写一行数据
#include#include#includeusing namespace std;int main(){ string line; while (getline(cin, line)) { string sum, x; stringstream ss(line); while (ss >> x) sum += x; cout << sum << "\原创 2016-11-14 12:07:19 · 2493 阅读 · 0 评论 -
换硬币问题
硬币每种数量足够,给定要兑换的数值,给出兑换最少所需的数量。典型的动态规划问题,先占个坑,附上代码,有空再补上具体解析#include#include#include#define Num 1000using namespace std;int Get_min_coins(int coins[], int value){ int d[Num]; //动态数组用来存储最原创 2016-10-31 22:33:32 · 1135 阅读 · 0 评论 -
最长回文子串
分为字符串长度为奇数还是偶数讨论,代码如下#define _CRT_SECURE_NO_WARNINGS#include #include #include #includeusing namespace std;int LongestPalindrome(const char *s, int n){ int i, j, max, c; if (s == 0 ||原创 2016-11-07 20:24:47 · 382 阅读 · 0 评论 -
图的着色问题
回溯法 图的着色问题原创 2016-11-07 12:13:09 · 1272 阅读 · 0 评论 -
和为定值得多个数的递归求解算法
题目如下: 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来。 分析: 两个数和为定值的算法相信大家都知道怎么做,这道题要求任意数量,仔细思考之后,发现这是典型的0-1背包问题,利用递归迭代,就可以解决问题。#include#includeusing namespace std;li原创 2016-10-25 01:39:29 · 977 阅读 · 0 评论 -
包含重复元素的全排列
#include#include#includeusing namespace std;int n = 0;//统计全排列个数ofstream out("output.txt");// 交换 templatevoid Swap(Type &a, Type &b){ Type temp = a; a = b; b = temp;}// 判断是否是重复元素交换te原创 2016-11-21 21:15:39 · 1825 阅读 · 0 评论 -
a+b的结果最接近sum
/** * 题目: * 给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的平均时间复杂度是 O(n)public class FindSumClosest { //找出 差别最小的差值 public static void getClosestDiff(int[] array, int value) { //初始指针指原创 2016-12-04 18:41:35 · 703 阅读 · 0 评论 -
二叉树的遍历(递归与非递归)
前序遍历(递归)void preorderRecursive(TreeNode * node) { if (node == NULL) return; visit(node); preorderRecursive(node->left); preorderRecursive(node->right);}前序遍历(非递归)void preorderNon原创 2016-11-23 20:09:39 · 407 阅读 · 0 评论 -
Word Search II 解题报告
转载自:http://blog.csdn.net/ljiabin/article/details/45846527 【题目】Given a 2D board and a list of words from the dictionary, find all words in the board.Each word must be constructed from lett转载 2017-02-25 11:44:02 · 580 阅读 · 0 评论 -
Tire树
转载自:http://blog.csdn.net/v_july_v/article/details/6897097 从Trie树(字典树)谈到后缀树说明:本文基本上是“整理”性质,致谢文末的参考文献。 引言 常关注本blog的读者朋友想必看过此篇文章:从B树、B+树、B*树谈到R 树,这次,咱们来讲另外两种树:Ti转载 2017-03-05 21:09:40 · 2853 阅读 · 0 评论 -
找出最长回文字子串的长度
题目:给定一个字符串,求出它的最长回文子串的长度。如何进行高效判断呢?如果一段字符串是回文串,那么以某个子字符为中心的前缀和后缀必定是相同的,因此,我们可以枚举中心位置,然后再在改位置上拓展,记录并更新得到最新的的最长回文子串。代码如下; int LongestPalindrome(const char *s,int n){ int i,j,max,c原创 2017-02-27 22:45:19 · 341 阅读 · 2 评论 -
字符串的全排列
题目:输入一个字符串,返回字符串中所有字符的全排列解法:递归算法 void permutation(char *perm,int from ,int to){ if(to<=1) return ; if(from==to) { for(int i=0;i<=to;i++) { cout<<perm[i]; }原创 2017-02-27 22:20:31 · 208 阅读 · 0 评论 -
字符串的包含问题
题目:给定一个长字符串a和一短字符串b,要求最快的判断出短字符串b的所有字符是否都在a中,注意这里只是要求所有字符,如a为“abcd”,而b为“aa”,同样认为a包含b的所有字符。解法一:暴力 直接两个for循环,将b中的字符逐个与a中字符进行比较,看是否都在字符串a中代码这里就不写了时间复杂度O(n^2)解法二: 排序后轮询排序需要O(nlog(n原创 2017-02-27 22:11:06 · 501 阅读 · 1 评论 -
字符串的旋转
题目:给定一个字符串,要求字符串前若干个字符移动字符串的尾部。例如,将“abcdef"前三个字符移到尾部,那么原字符串变为”defabc“。写一个函数实现此功能。解法1: 暴力,也是容易想到的一种方法,即一个字符一个字符的移动到字符串末尾。假设字符串的长度为n,要移动的字符串前缀长度为m。首先编写每次左移一位的函数LeftShiftOnevoid LeftShi原创 2017-02-27 21:42:38 · 732 阅读 · 0 评论