
笔试面试题
文章平均质量分 81
fanzitao
数据挖掘/Java/hadoop/python/shell
展开
-
1209.Remove All Adjacent Duplicates in String II 简单解法
Given a string s, a k duplicate removal consists of choosing k adjacent and equal letters from s and removing them causing the left and the right side of the deleted substring to concatenate together....原创 2020-02-17 18:33:13 · 432 阅读 · 0 评论 -
在排序数组中,找出给定数字的出现次数
public class CountTimesInSortedArray { /** * 题目:在排序数组中,找出给定数字的出现次数,比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。 * 解法:使用二分查找的方法分别找出给定数字的开始和结束位置,最坏情况下时间复杂度为O(logn) */ public static void main(String[] args) ...原创 2012-08-14 22:35:46 · 1691 阅读 · 0 评论 -
和为n的连续子序列
输入一个正整数n,和一个正整数NUM求出1-n中所有连续子序列使得,子序列的和等于NUM#include<iostream>using namespace std;int main(){ int n,NUM; cout<<"input n = "; cin>>n; cout<<"SUM = ...原创 2012-10-05 16:49:44 · 2767 阅读 · 1 评论 -
N个骰子点数之和的分布
将N个均匀的骰子,扔在地上,求点数之和的分布。因为是分布,自然是求N个筛子之和等于M的概率,p(m)p(m) = fre(n,m)/sumfre(n,m)是指n个骰子扔出m个点数的 总的可能情况,这个就相当于组合数,只是限制了每个骰子的点数在1-6之间。sum是n个骰子扔地上所有可能情况之和。因为每个骰子可能的点数在1-6之间,所以n个骰子组合的点数在n和6n之间,总共5...原创 2012-10-04 15:21:44 · 8044 阅读 · 3 评论 -
最大连续子序列乘积
问题描述:给定一个整数序列(可能有正数,0和负数),求它的一个连续最大子序列乘积,如果乘积为负数,输出-1分析:假设数组为a[],直接利用动归来求解,考虑到可能存在负数的情况,我们用Max[i]来表示以a[i]结尾的最大连续子序列的乘积值,用Min[i]表示以a[i]结尾的最小的连续子序列的乘积值,那么状态转移方程为: Max[i]=max{a[i], Max[i-1]*a[i]...转载 2012-09-25 10:41:30 · 5172 阅读 · 0 评论 -
0-1背包问题
只解释一下递推公式m[i][j] = max(m[i-1][j],m[i-1][j-w[i]]+v[i])m[i][j]表示,前i个物体装进最大容量为j的包里能获得的最大价值,如果这个解不包括 i 物体,那么就等于m[i-1][j],即前i-1个物体放入容量为j的包里锁获得的最大价值;如果包括 i 物体,那么就等于m[i-1][ j-w[i] ] +v[i], 要能把物体i放进去,...原创 2012-09-27 15:07:16 · 908 阅读 · 0 评论 -
n*n的ZigZag数组
ZigZag数组就是形如下图的,依次沿对角线增加->减小交替变换的数组0 1 5 6 14 15 27 282 4 7 13 16 26 29 423 8 12 17 25 30原创 2012-09-02 15:13:39 · 7287 阅读 · 0 评论 -
输出1到最大的N位数
题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。思路:由于N非常大的话,会超过long long的表示范围,所以先求出n位十进制数的最大值max,然后从1到max循环输出是不可行的。我们可以用n个元素的数组,每一位对应数字中的每一位:第n-1位: 表示个位第n-2位: 表示十位................原创 2012-08-22 17:07:05 · 1434 阅读 · 0 评论 -
有序数组转化为二叉树
这个题目有点模棱两可,只说转化成二叉树。也没有说平衡二叉树,二叉排序树。如果只是随便什么二叉树都可以,把就用数组作为输出,随便是前序,中序,还是后续构建二叉树都可以,网上二叉树建立的代码一大堆。下面代码是简历一棵二叉排序树。首先用数组的中间元素作为根建立二叉树,然后递归简历左子树,右子树。#include<iostream>#include<...原创 2012-09-29 12:45:56 · 8552 阅读 · 2 评论 -
求二维矩阵的最大子矩阵
1、使用积累数组cumarr[1...n][1...n],使得求任意块儿子矩阵和的复杂度为O(1),cumarr[i][j]为cumarr[1...i][1...j]子矩阵的和, 通过cumarr[i][j]=cumarr[i-1][j]+cumarr[i][j-1]-cumarr[i-1][j-1]计算积累数组,复杂度为O(N*N),2、枚举+dp 对矩阵的行枚举,确定矩...转载 2012-10-05 09:44:27 · 2763 阅读 · 0 评论 -
后缀树
http://www.cppblog.com/superKiki/archive/2010/10/29/131786.aspx 在pongba的讨论组上看到一道Amazon的面试题:找出给定字符串里的最长回文。例子:输入XMADAMYX。则输出MADAM。这道题的流行解法是用后缀树(Suffix Tree)。这坨数据结构最酷的地方是用它能高效解决一大票复杂的字符串编程问题: 在文本T转载 2012-10-05 21:01:03 · 36115 阅读 · 6 评论 -
找出数组中和为N+1的的所有组合
一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。复杂度最好是O(n),如果是O(n2)则不得分方法一:排序后,定义两个指针begin,end分别指向数组的第一个和最后一个元素。然后按以下规则移动指针:1. 如果*begin + *end =原创 2020-03-16 19:07:31 · 3655 阅读 · 2 评论 -
删除字符串开始及末尾的空白符,并且把数组中间的多个空格(如果有)符转化为1个。
删除字符串开始及末尾的空白符,并且把数组中间的多个空格(如果有)符转化为1个。写的不是很简洁,有好几处需要特别注意的地方方法:2个指针,space指向第一个空格,letter指向space之后的第一个字母,然后把letter指向的字母复制到space指向的空格。这里要注意几个地方:1. 因为2个单词之间要空一个空格,所以复制之前要space++,不然一个空格都没有了原创 2012-09-14 10:17:05 · 4719 阅读 · 1 评论 -
有一个单向循环链表,从头开始报数,报到m或者m的倍数的元素出队。根据出队的先后顺序再组成一个单向循环链表。
有一个单向循环链表,从头开始报数,报到m或者m的倍数的元素出队。根据出队的先后顺序再组成一个单向循环链表。函数的原型:void reorder(Node **head,int m);个人以为,这题目是约瑟夫环的变种。方法就是沿循环链表依次报数,报到编号能被m整除的,就把这个节点从原链表中删除,链接到新的链表中去。循环终止的条件,就是只剩下最后一个节点,即:p->next == p原创 2012-09-13 18:27:08 · 19710 阅读 · 0 评论 -
输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。假如需要求的N=23106,那么计算过程如下:万位=1:1 0000--1 9999 共计10000个千位=1: 0 1 000--2 1 999 共计3*1000 = 3000,其中3表示万原创 2012-08-26 09:05:09 · 7950 阅读 · 0 评论 -
一次遍历反转链表
题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。分两种情况:带头结点的链表,不带头结点的链表#include "stdafx.h"#include#includeusing namespace std;typedef struct node{ int data; struct node *next;}Node,*List;List crea原创 2012-08-26 15:15:06 · 836 阅读 · 0 评论 -
2个有序数组求合并后的中位数
原题:2个等长,有序数组x[], y[],求2个数组合并后的中位数。这里有一个问题:2个长度为n的数组,合并后长度为2n,那么这个中位数是第n个呢,还是第n+1个呢?这点我也没想明白,就按第n个算。这个问题的实质,就是求合并后长度为2n的数组中的第n个数。方法一:合并2个有序数组,比较次数是n+n. 其实我们没必要完全排序这2个数组,只要排序前n个即可,只要的话比较次数刚好为n;原创 2012-09-12 22:17:06 · 6212 阅读 · 0 评论 -
N的拆分
#include#includeusing namespace std;void Sum(int sum, vector& v){ if(sum == 0) { vector::iterator ite; for(ite = v.begin(); ite != v.end(); ++ite) {转载 2012-09-27 11:54:30 · 2360 阅读 · 0 评论 -
判断一个链表中是否有环
这是一个链表追击问题,设2个指针,一个一次走2步,一个一次走一步。如果有环的话,最终快的指针会追上慢的指针,如果没有环的话,快的指针会首先到达NULL这里我也有疑问,会不会每次都会跳过去?#include "stdafx.h" #include#includeusing namespace std;typedef struct node{ int data; stru原创 2012-08-27 16:22:20 · 1176 阅读 · 0 评论 -
判断一个数是否是平方数
二分法#includeusing namespace std;int find(int n,int begin,int end){ if(n==0) return 0; if(begin<end) { int mid = (begin+end+1)/2;//plus is very im原创 2012-10-06 13:07:14 · 2522 阅读 · 0 评论 -
找出二叉排序树中满足某一条件的节点
一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。复杂度如果是O(n2)则不得分。#include "stdafx.h"#include<iostream>#include<queue>using namespace std;typedef struct node{ int data; ...原创 2012-08-31 21:04:43 · 1422 阅读 · 1 评论 -
字符串相等问题
如果两个字符串含有相同的字母,并且相同字母的个数也相同,那么就称这2个字符串是相等的。判断2个字符串相等可以用数组的办法来解决,思路类似位图申请一个int a[26](假设字符集是26个字谜)然后扫描字符串A;对于每一个A[i], 做a[A[i]-'a']++然后扫描字符串B:对于每一个B:做a[B[i]-'a']--如果之后a数组的每个元素都是原创 2012-07-17 16:10:23 · 1144 阅读 · 0 评论 -
堆排序的数组实现
数组实现:#include "stdafx.h" #includeusing namespace std;void adjustHeap(int a[],int index,int length){ int record = a[index]; for(int j = 2*index;j<length;j*=2)// {原创 2012-05-30 11:10:04 · 2582 阅读 · 0 评论 -
10枪90环所有排列数
#include "stdafx.h"#include#includeusing namespace std;/* 求出10次射击总计打出90环的所有排列,每枪的环数在1-10环*/int result[10]={0};int sum = 0;void display(){ for(int i=0;i<10;i++) { cout<<result[i]<<" "; }原创 2012-06-08 15:25:43 · 1955 阅读 · 1 评论 -
基于快速排序的TOPK算法
类似于快速排序,首先选择一个划分元,如果这个划分元的序号index刚好等于k,那么这个划分元以及左边的数,刚好组成了top-k small data;如果index>k, 那top-k small data在index的左边,那么就继续递归从index-1和数中选取top-k.如果index 代码如下:public class TopK_Quick { public stati原创 2012-05-30 17:37:50 · 6341 阅读 · 7 评论 -
循环左移字符串
字符串左移K次首先需要判断K的大小,因为左移K次和左移K%str.length()效果是一样的。所以第一步有必要:K = K%str.length();方法一:每次左移一位,需要运行K轮. 时间复杂度kn, 空间复杂度 1方法二:需要一块与字符串同样大小的额外存储空间。假如元数组为a[1-n], 额外分配的空间为b[1-n], 那么实现左移K位以为可以按照以下的步骤原创 2012-07-17 13:52:15 · 3260 阅读 · 0 评论 -
素数和分解
一个整数可以分解成若干素数的和输入一个整数,试求出所有可能的分解#include#include#includeusing namespace std;void function(int n,int begin,vector& prime){ static vector result;//静态局部向量,不要用引用参数 if(n<0) return;原创 2012-10-06 17:31:55 · 1561 阅读 · 0 评论 -
RGB序列
题目:如果一个字符串是由RGB三个字母随机组成的,那么试将所有的R移动到字符串的左端,B移动到右端,G在中间。方法:本题跟将一个数组的奇数偶数分开,或者正数负数分开类似。起初可以将GB看成一种情况,讲R和GB分别放在左右两端,然后再将GB分开。#includeusing namespace std;int main(){ char str[] = "RRRBGBGGGBBB原创 2012-09-26 21:33:27 · 1213 阅读 · 0 评论 -
不调用库函数,求sin(x)
第一首先是泰勒公式,不过公式哥不记得了,有兴趣的去查查,那个实现不难。第二递归,利用3个公式sin(x) = 2 * sin(x/2)*cos(x/2)----------------公式1cos(x) = sqrt(1 - sin(x)*sin(x))----------------公式2lim sinx = x, 当x趋向于0的时候-----------------公式原创 2012-10-31 18:15:06 · 2402 阅读 · 1 评论 -
求第1500个能被2或者3或者5所整除的数
方法一:暴力枚举2,3,4......,依次判断n能否被2|3|5整除,直到找到第1500个#include <iostream>//#include <string.h>using namespace std;int main(int argc, char *argv[]){ int count = 1; int i; for(...原创 2012-10-06 15:10:11 · 2028 阅读 · 0 评论 -
求字符串中重复出现的最长字串
求字符串中重复出现的最长字串例如字符串:drgabcifrabcsdrrs中,最长公共字串是:abc方法:利用后缀树来求。字符串的后缀树有如下:drgabcifrabcsdrrsrgabcifrabcsdrrsgabcifrabcsdrrsabcifrabcsdrrs---------s1..............rabcsdrrsabcsdrrs----...原创 2012-10-08 23:00:56 · 2060 阅读 · 0 评论 -
字符串移动(字符串为*号和26个字母的任意组合,把*号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小
字符串移动(字符串为*号和26个字母的任意组合,把*号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小 如果没有要求保证字母相对顺序不变的话,那么这题用2个双端指针,往中间移动交换元素是最简单的,但是这种移动有跳跃性,所以无法保证相对次序方法见注释:主要思想是,用一个point指针指向尾部的第一个*,从后从point除法,用指针let指向poi原创 2012-09-13 23:00:51 · 4507 阅读 · 3 评论 -
合并有序链表
将2个分别有序的链表合并成一个链表,并且合并后的链表依然有序。方法:初始化一个头结点head,然后比较list1,和list2链表的第一个节点,选择比较小的连接到head上去,如此往复。#include "stdafx.h"#include#includeusing namespace std;typedef struct node{ int da原创 2012-08-27 15:46:06 · 11264 阅读 · 4 评论 -
最长公共子序列
最简单的动态规划问题,原理网上一大堆,直接上代码public class LCS { public static int max(int a,int b) { return a>b?a:b; } public static void getLCS(String str1,String str2,int matrix[][])//求解过程 { int lena =原创 2012-08-26 10:54:14 · 743 阅读 · 0 评论 -
C/C++中extern关键字详解
C/C++中extern关键字详解1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这转载 2012-08-25 22:52:25 · 695 阅读 · 0 评论 -
字符串转换为整数
注意:处理正负号,可以处理正负号,字母打头,-+打头,以及其中字符串中间含有非法字符的情况。bool change(char *str,int &num){ num = 0; int mul = 1; if(*str=='-'||*str=='+') { if(*str=='-') mul原创 2012-08-31 20:51:44 · 669 阅读 · 0 评论 -
有一个整数数组,请求出两两之差绝对值的最小值
方法一:穷举#include#include#define MAX 1000using namespace std;int a[] = {-3,4,2,7,25,0,8,-2};int getMin(int a[],int i,int j){ return abs(a[i]-a[j]);}int main(){ int len = sizeof(a)/siz原创 2012-08-31 20:50:15 · 7406 阅读 · 0 评论 -
扑克牌的顺子
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。思路:我们将2张王抽象成数字0,1. 首先如果五张牌中有 非0重复的牌的话,肯定不是顺子;2. 一副牌中王的数目也不应该超过2个,当然这里不一定只有一副牌,我们暂且按一副牌考虑,因为0的数目少,要求就严格一点3. 如果原创 2012-08-22 16:05:39 · 2845 阅读 · 0 评论 -
旋转数组的最小元素
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。 分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找转载 2012-08-22 10:34:28 · 631 阅读 · 0 评论 -
顺时针打印矩阵
顺时针打印矩阵题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213原创 2012-08-22 09:15:31 · 1795 阅读 · 0 评论