Jobdu
ojshilu
https://github.com/lucky521
展开
-
1046 最大值
1,32位int的最小值是多少? -2**31吧。-2147483648#include#includeusing namespace std;int main(){ int m[10]; int max; while(1) { max = -2147483648; for(int i=0;i<10;i++) { if(scanf("%d",&m[原创 2013-07-13 16:24:30 · 724 阅读 · 0 评论 -
一个序列里的数字都是成对的,只有一个是单个的,找出来。
#include#includeusing namespace std;int main(){ int n,result=0; scanf("%d",&n); if(n%2 == 0) { printf("impossible!\n"); //这样的序列的个数一定是奇数个元素 return 0; } int *a = new int[n]; f原创 2013-07-15 21:07:52 · 2236 阅读 · 1 评论 -
序列中,除了2个数字只出现一次外,其他数字成对出现。找出落单的2个数。
本题是上一题的续篇,扩展篇。想把这一问题先转化为上一个问题,然后解决掉。于是需要将序列分成2类,正好把两个落单的数划分到两个类中去。1,位运算的优先级真是搞不清楚。以后遇上^&|>,这样的运算外都用小括号括上。 if((a[i]&cls) == 0) 这句话 如果不给&加上小括号,就会出错。2,第一次先把序列异或起来,得到的结果其实就是两个落单的数的异或。分析结果,结果的二进制中为1的原创 2013-07-15 21:59:29 · 2376 阅读 · 0 评论 -
丑数 Ugly Numbers
问题:Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, …shows the first 11 ugly numbers. By convention, 1 is included. Write a program to原创 2013-12-29 16:22:04 · 1643 阅读 · 0 评论 -
逆转链表 Reverse Linked List
#include#include#includeusing namespace std;typedef struct node{ int data; struct node *next;}node,*List;int main(){ List head = NULL; node *n; int input; cin>>input; while(input != -原创 2013-07-12 15:43:22 · 1411 阅读 · 0 评论 -
杨氏矩阵中的查找问题
1,太不细心了:行列不分!!与或不分!!2,边界值要想清楚。3,申请完内存要释放。4,scanf来替代cin5,整型数组的scanf也得有&#include#includeusing namespace std;int main(){ int row_num, col_num, value; int index_row, index_col; int f原创 2013-07-13 10:06:57 · 1317 阅读 · 0 评论 -
二进制形式中1的个数
#include#includeusing namespace std;int main(){int input,count,num;scanf("%d",&num);for(int i =0;i{scanf("%d",&input);if(input == 0){printf("0\n");continue;}count原创 2013-07-12 16:16:58 · 852 阅读 · 0 评论 -
根据前序和中序序列重建二叉树 Construct Binary Tree from Preorder and Inorder Traversal
9oj编号1385。题目:根据二叉树的前序遍历序列和中序遍历序列,求得该二叉树的后序遍历序列。注意:有个前提,二叉树中的所有元素都不相同。方法:根据前序序列和中序序列重建二叉树原型,然后进行后序遍历。所以关键就在于重建二叉树。使用递归的方法比较容易。如下图所示,对于二叉树的构建过程也是递归的。首先把当前前序遍历序列的第一个元素作为root结点,并在在中序遍历中找原创 2013-09-20 22:18:02 · 1250 阅读 · 0 评论 -
圆圈报数最后剩下的数 约瑟夫环问题 Joseph
问题:有n个数,围成一个圈。现在从某一个数开始顺时针报数(第一个报1,依次报数),当报到m时,将报数者删除。并从下一个数开始重新报数。问,最后一个留下的数是谁?假设这n个数依次是0,1,2...n-1。问题源于:高德纳的《具体数学》。9oj编号1356。剑指45。思路:本题最直观的思路是按照题目说的一步一步做,O(n*m)级别的。当数字n很大的时候,变得非常慢。因此下面原创 2013-09-15 22:35:24 · 4142 阅读 · 1 评论 -
Find subarray with given sum
问题:Given an unsorted array of integers, find a continous subarray which adds to a given number.注意:数组中有正有负。参见:http://stackoverflow.com/questions/5534063/zero-sum-subarray#include#include#in原创 2014-03-17 20:37:29 · 837 阅读 · 0 评论 -
翻转单词顺序 Reverse Words in a String
问题:Given an input string, reverse the string word by word. For example,Given s = "the sky is blue",return "blue is sky the".思路:两轮翻转。第一次整个串彻底反转,第二次逐个单词自身翻转。输入用例:输入数据的细节特别重要。开头有空格、结尾有空格、多个原创 2013-09-05 20:19:01 · 969 阅读 · 0 评论 -
找出穿过最多点的直线 Max Points on a Line
平面上有若干个点,要你找出一条直线,使其能穿过最多的点。思路:枚举法。求出任意两点之间的线,以直线(斜率,与y轴的交点坐标)的形式存储到map。这样个数最多的直线就是所求。时间O(N^2),空间O(N).注意特殊情况:1、当直线的斜率为无穷大时,其与y轴没有交点,但是和x轴的交点不相同,这时候我需要特殊表示一下。2、点集中有重叠的点时,算几个点?原创 2014-03-20 21:34:52 · 6242 阅读 · 2 评论 -
两个有序链表的合并 Merge Two Sorted Lists
1、记着怎么定义这样的结构体。typedef struct node{ int data; struct node *next;}node, *List;2、到哪儿都注意,防止指针为空、防止链表为空。List merge(List l1, List l2){ node *p3; List l3=NULL; if(l1==NULL) return l2原创 2013-09-05 12:55:33 · 1409 阅读 · 0 评论 -
1390 小矩形覆盖
1,递归方法超时2,int型存储溢出3,Output Limit Exceeded错误#include#includeusing namespace std;unsigned long a[71];int fun(int n){ for(int i=1;i<=n;i++) if(i == 1) a[i] = 1; else if(i ==2)原创 2013-07-12 17:50:02 · 882 阅读 · 0 评论 -
1350 求二叉树的深度
竟然运行一次直接AC!!不可思议!明天再看一下。#include#includeusing namespace std;typedef struct Tnode{ int data; struct Tnode *left; struct Tnode *right;}Tnode;int depth(Tnode *root){ if(root == NULL)原创 2013-07-13 23:05:31 · 748 阅读 · 0 评论 -
1048 三角形形状判断
1,排序算法基础还是不够好。写了好久。2,整型数组int[ ],直接可以用作址传递。因为数组名直接当做指针了。#include#includeusing namespace std;void sort(int a[]){ int i,j,tmp; for(i=1;i<3;i++) { tmp = a[i]; for(j=i-1;j>=0;j--) {原创 2013-07-13 17:13:44 · 997 阅读 · 0 评论 -
1387 斐波纳契
#include#includeusing namespace std;// 0 1 1 2 3 5unsigned long m[71];unsigned long fun(int n){ for(int i=0;i<=n;i++) { if(i==0) m[i]=0; else if(i==1) m[i]=1; else m[i]=m[i-1]原创 2013-07-13 10:23:15 · 801 阅读 · 0 评论 -
1352 找出数组中和为k的两个数
#include#includeusing namespace std;int main(){ int n,k; int *a; while(scanf("%d %d",&n,&k)!=EOF) { a = new int[n]; for(int i=0;i<n;i++) scanf("%d",&a[i]); int left=0,right=n-1; w原创 2013-07-14 20:34:52 · 1055 阅读 · 0 评论 -
1349 数字在有序序列中出现的次数
1,极端情况要想清楚。都考虑到、并处理掉,才可以。2,数组的长度受内存大小限制,太大的话就要另想算法了。3,用二分查找更好。怎么样设计两种不同的二分查找?原创 2013-07-14 22:12:19 · 913 阅读 · 0 评论 -
依然是最长回文子串 9OJ-1528
1528编号的9oj,回文问题。这个题用比较好的动态规划法的话会出现内存溢出,因为输入的字符串长度太长了。表示状态量的二维数组存不下。换成最直观的办法反倒AC了。就是:依次以每一个字符为回文中心往两端扩大判断,依次以两个相同的字符为中心往两端扩大判断。#include #include #include #define N 200000int LongestPalin原创 2013-10-03 16:53:34 · 941 阅读 · 0 评论 -
无重复货币面值组合所不能表示的最小钱数 DP思想
9OJ编号1531。题目:给出若干种货币的面值,问这些面值组合(不重复)起来所不能表示的最小钱数值(自然数)。例如:输入:1 2 3 9 100输出:7这个题隐含的,如果这些面值里没有1元钱,那最小钱数肯定是1。思路:这种题目一般有两个方向的思路。一是,从目标出发,从小到大判断每个自然数是否满足条件(可以被这些面值组合成)。二者,从已知出发,逐步扩大规模,求出结果。原创 2013-10-04 18:16:33 · 1539 阅读 · 0 评论 -
1362 循环左移字符串
1、根据1361的原理,对这道题进行联想。发现本问题可以采用两次翻转方法。(看来这样翻转局部位置但不翻转内部顺序的问题都可以这样解决)第一次整体翻转,第二次局部翻转。(或者先局部翻转,再整体翻转)2、需要注意一个点:循环左移。 要做到真正的循环,需要对移动次数求模。找到实际移动的次数。# include# include# include int reverse(cha原创 2013-09-05 20:45:22 · 1128 阅读 · 0 评论 -
1508 把字符串转换成整数 atoi()
# include# include# include int my_atoi(char *str, int &num) //返回值表示状态{ int sign=1,index=0, w=1; int len = strlen(str); if(str==NULL || len==0) //合法性检查 return -1; if(str[index]=='-') //正负数原创 2013-09-05 16:24:50 · 1080 阅读 · 0 评论 -
1510 替换空格
#include#includeusing namespace std; int main(){ char str[1000000]; gets(str); if("" == str) return 0; int len = 0; int blanknum = 0; int i =原创 2013-07-12 14:55:42 · 966 阅读 · 0 评论 -
图的有条件的寻路 BFS_search
题目源自于9oj编号1545。题目:已知一个无向带权图,求最小整数k。使仅使用权值小于等于k的边,节点1可以与节点n连通。即,在图中寻找到一条1结点~n结点的路径,并且路径上的所有权值的最大值最小。思路:1、寻路:图的BFS或者DFS2、满足条件:路径上的最大权值最小一种方法:把每条能够到达的路径找到,且记录下这条路径上的最大权值。另一种方法:每次设定一个权原创 2013-10-15 21:26:00 · 1456 阅读 · 0 评论 -
1202 排序
#include#includeusing namespace std;void sort(int a[],int n){ int i,j,tmp; for(i=1;i<n;i++) { tmp = a[i]; for(j=i-1;j>=0;j--) { if(tmp>a[j]) break; } for(int k=i;k>j+1;k--)原创 2013-07-13 22:13:56 · 965 阅读 · 0 评论 -
数组中出现次数超过一半的数字 MoreThanHalfNum
9oj编号1370. 剑指29. 编程之美的发帖水王。普通方法:排序,然后找位于中间位置的数。进阶方法:Hash映射次数。高级方法:擂台PK法。排序法(堆排序)的代码:#include //向堆中加入新元素并调整void MinHeapFixup(int a[], int i){ int j, temp; if(i==0) return;原创 2013-09-28 17:51:11 · 1328 阅读 · 0 评论