俊介三

一天更新一点,一天积累一点

导航

2013年9月21日

摘要: [转]http://blog.sina.com.cn/s/blog_6d932f2a0101jgyz.html问题1:3的方幂及不相等的3的方幂的和排列成递增序列{1,3,4,9,10,12,13…},写出数列第300项。这里说明一下,全文都不考虑数的长度会不会超过我们定义类型的最大值。分析:首先想到的是再继续列出后面的一些项,找找规律。1 →第一行有1个数3,4→第二行有2个数9,10,12,13→第三行有4个数27,28,30,34,36,37,39,40→第四行有8个数……→第k行有2k个数看见右边的数,我们应该很能够很敏感的看出规律来。比如这个数列的第12项37就可以拆成这样的形式:3 阅读全文

posted @ 2013-09-21 11:14 俊介三在前进 阅读(980) 评论(0) 推荐(0) 编辑

2013年4月8日

摘要: 题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。采用堆排比较好,但最后一个数据超时了?update(2013.4.16):用我面B公司时被问到的一个方法就能过,晕~~思路:类似快排的方法,每次递归地找k个数落入哪个部分。最后在sort一个这k个数就好,代码:#include <cstdio>#include <iostream>#include <algorithm>using namespace std; void partition(int*arr, int k, int 阅读全文

posted @ 2013-04-08 13:33 俊介三在前进 阅读(194) 评论(0) 推荐(0) 编辑

2013年4月6日

摘要: 我们使用的很多函数实际上不是函数,而是宏macro。例如:(getc()、putc()实际上也不是函数)#define getchar() getc(stdin)#define putchar((c)) putc((c), stdout)总结C语言的输入输出:#include <cstdio>#include <iostream>using namespace std;int main(){ //注意,声明为int,因为int范围比char要大 int ch; //从stdin中获得一个char ch = getchar(); //把ch输出到stdout... 阅读全文

posted @ 2013-04-06 19:49 俊介三在前进 阅读(172) 评论(0) 推荐(0) 编辑

摘要: 在计算机科学中,trie,又称前缀树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。参考资料:维基百科 Trie树详解应用场景:字符串精确搜索。代码:#include <iostream>#include <cstdio>#include <cstring>#define BRANCHNUM 26using n 阅读全文

posted @ 2013-04-06 15:22 俊介三在前进 阅读(265) 评论(0) 推荐(0) 编辑

2013年4月4日

摘要: 题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。http://ac.jobdu.com/problem.php?cid=1039&pid=9思路:这个问题思路很简单,但思路简单不意味着轻易能全对。对我做递归题有更深的了解吧,所以贴进来了。递归题的一般想法:1)看清结构,想办法分出递归子问题来;2)考虑递归到最后会出现哪些情况,如本题,要么左树为空、要么右树为空、要么都不为空、要么只剩一个元素等等情况,把这些情况if else一下,即分段讨论;3)用笔画出图来,找出每种情况题中i和j的关系 阅读全文

posted @ 2013-04-04 11:10 俊介三在前进 阅读(127) 评论(0) 推荐(0) 编辑

2013年4月3日

摘要: 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10思路:直接模拟它进行顺时针的行走,若遇到矩阵范围外,或已走过的区域,则转向;若不能转向了,则结束。但奇怪的是超时?最后一个case还没跑1秒就过去了~http://ac.jobdu.com/problem.php?cid=1039&pid=7代码:#include <stdio.h>#include < 阅读全文

posted @ 2013-04-03 22:09 俊介三在前进 阅读(142) 评论(0) 推荐(0) 编辑

摘要: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:一般思维从左上往右下一直找会遇到困难,因为向右和向下都是比自己大的,该往哪个方向走呢??最好的方法是从右上角开始走,找到就退出,比它大就向下走,比它小就往左走。。或者,从左下角开始走也行,总之保证它能走的方向只有一个。代码:#include <iostream>#include <stdio.h>using namespace std;bool helper(int* A, int m, i 阅读全文

posted @ 2013-04-03 13:30 俊介三在前进 阅读(186) 评论(0) 推荐(0) 编辑

2013年4月1日

摘要: 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是 O(n) ,空间复杂度是 O(1) 。思路:这是个比较新颖的题,经典的题是“给一个数组里面只有一个数字出现一次,其余的数都出现两次,把这个唯一的数找出来”,利用OXR操作的特性很容易把它找出来。即,抑或操作,相同为0,不同为1(0 ^ x) == x(x ^ x) == 0本题思路:抑或所有数,得到的是要找的数num1 num2的抑或值。由于这两个数是不相等的,那么这个抑或值一定不为0,就找到为1的位是那个,把原数组根据这个位分成两组。每组抑或得到的值即为所求的两个不同的数。代码 阅读全文

posted @ 2013-04-01 15:05 俊介三在前进 阅读(204) 评论(0) 推荐(0) 编辑

摘要: 一个数组是由一个递减数列左移若干位形成的,比如 {4 , 3 , 2 , 1 , 6 , 5}是由 {6 , 5 , 4 , 3 , 2 , 1} 左移两位形成的,在这种数组中查找某一个数。思路:二分查找,用if语句来进行“加强条件限制”(相当于中学时候分段讨论的思想),把具有单调性的一半讨论出来,如果不在此单调性段内,则在复杂的else中找去。知道找到或最后找不到为止。代码:#include <stdio.h>int helper(int* arr, int key, int start, int end);//return the index of the element if 阅读全文

posted @ 2013-04-01 13:46 俊介三在前进 阅读(825) 评论(0) 推荐(0) 编辑

摘要: 问题描述:卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。输入一个整数n,计算h(n)。其递归式如下:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2,h(0) = h(1) = 1) 该递推关系的解为:h(n)=C(2n,n)/(n+1) (n=1,2,3,...)思路:直接根据递归式,写出相应的算法。代码: //函数功能: 计算Catalan的第n项 //函数参数: n为项数 //返回值: 第n个Catalan数 int Catalan(int n) { ... 阅读全文

posted @ 2013-04-01 12:11 俊介三在前进 阅读(1637) 评论(1) 推荐(0) 编辑