九度|剑指OFFER
Rabbit誩
无
展开
-
题目1506:求1+2+3+...+n
函数指针,天了噜。。。#include #include int n; typedef int (*fun)(int); //定义一个返回值是int,带一个int参数的函数指针,fun int fun1(int n) { return 0; } int fun2(int n) { fun f[2]={fun1,fun2}; return n+f[!!n](n-1); } int m原创 2015-01-31 18:39:47 · 436 阅读 · 0 评论 -
题目1515:打印1到最大的N位数
这这这。。。大水题 #include #include #include int main() { int n; while(scanf("%d",&n) != EOF) { n = pow(10,n)-1; for(int i = 1;i <= n;++i) printf("%d\n",i); } return 0; }原创 2015-02-15 13:36:51 · 322 阅读 · 0 评论 -
题目1517:链表中倒数第k个结点
其实直接算链表长度-k就行了 上次写的双向链表出了问题,就再写了一次。返回尾指针即可 #include #include #include typedef struct node { int val; struct node *next; struct node *pre; }Sqlist; int n,k; Sqlist *create() { Sqlist *l1,*l2,*t原创 2015-02-15 17:02:52 · 356 阅读 · 0 评论 -
题目1516:调整数组顺序使奇数位于偶数前面
想要降低复杂度,就必须用空间来换,开2个数组记录奇数偶数也许,用空间换时间,而用队列记录的话,空间复杂度开销会小一半 #include #include #include using namespace std; int a[111111]; int main() { int n; while(scanf("%d",&n) != EOF) { for(int i=0;i<n;++i原创 2015-02-15 14:01:09 · 366 阅读 · 0 评论 -
题目1520:树的子结构
找B的跟节点和A的跟节点一样的点,在遍历左右子树,如果都相同则返回true,否则继续寻找 #include #include typedef struct node { int val; struct node *left; struct node *right; void setVal(int v) { this->val = v; left = right = NULL原创 2015-03-09 14:06:40 · 339 阅读 · 0 评论 -
题目1391:顺时针打印矩阵
WA了好久,注释部分不知道怎么错了,记录4条边的输出长度。 后来改了,用i,j表示计算到的位置,把输出了的值赋值成-1,就能判断边界了,然后就循环就行了。 #include #include int m[1111][1111]; int mm,n; int main() { while(scanf("%d%d",&n,&mm) != EOF) { if(n <= 0 && m <=原创 2015-03-10 11:11:13 · 371 阅读 · 0 评论 -
题目1521:二叉树的镜像
直接输出中右左就行了的。代码其实没有把单子树翻转,要翻转也很简单,不管了,A了就行 直接模拟过程就行了! #include #include typedef struct node { int val; struct node *left; struct node *right; void setVal(int v) { this->val = v; left = righ原创 2015-03-09 17:41:08 · 394 阅读 · 0 评论 -
题目1366:栈的压入、弹出序列
就模拟栈的进出过程 #include #include #include using namespace std; int a[100002]; int main() { int n; while(scanf("%d",&n) != EOF) { stackst1; for(int i=0;i<n;++i) { scanf("%d",&a[i]); }原创 2015-03-10 13:30:46 · 392 阅读 · 0 评论 -
题目1368:二叉树中和为某一值的路径
记录树中的编号,递归寻找路径直到叶子节点就行了 如果还没到叶子节点和就大于K就不用再递归了,减枝 注意要字典序输出,如果right大于left就会导致递归得不到字典序,交换左右 #include #include #include using namespace std; typedef struct node { int val; int index; struct node *原创 2015-03-10 22:08:27 · 385 阅读 · 0 评论 -
题目1523:从上往下打印二叉树
明明PE,显示WA,郁闷。 层次遍历,利用队列,把根入队列 循环-》输出队首-》儿子入队列 over #include #include #include using namespace std; typedef struct node { int val; struct node *left; struct node *right; void setVal(int v) {原创 2015-03-10 19:32:23 · 376 阅读 · 0 评论 -
题目1369:字符串的排列
就是一个字符串的全排列问题,字典序的话,先对字符串排序 注意有重复的字符,所以如果全部输出全排列会有重复的 #include #include char str[11]; int vis[11]; void dfs(int count,char ss[]) { int len=strlen(str); if(count >= len) { ss[count] = '\0';原创 2015-03-11 17:23:40 · 377 阅读 · 0 评论 -
题目1524:复杂链表的复制
模拟这个链表就行了 #include #include #include typedef struct node { int val; struct node *next; struct node *other; void setVal(int v) { this->val = v; next = other = NULL; } }List; void createLis原创 2015-03-10 22:33:50 · 469 阅读 · 0 评论 -
题目1503:二叉搜索树与双向链表
方法很简单,就是建树,然后因为是二叉搜索树,所以中序遍历就是排序好的了 开始天真,想错了 也是中序的思想,然后创建链表指针 #include #include #include typedef struct node { int val; struct node *left; struct node *right; struct node *pre,*next; }Tree;原创 2015-03-11 16:29:43 · 313 阅读 · 0 评论 -
题目1514:数值的整数次方
直接循环次方就行了,用递归行了,注意INF的输出就行了,0不能做被除数 #include #include #include double powX(double a,int b) { if(b == 1) return a; if(b == 0) return 1; double res = powX(a,b>>1); res*=res; if(b&1) res*=a;原创 2015-02-15 13:32:22 · 341 阅读 · 0 评论 -
题目1513:二进制中1的个数
用位运算,但是不要用n>>=1;如果n是负数的话,就不会停止,改用flag #include #include int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); int count = 0; int flag = 1; while(flag) { if(n&fla原创 2015-02-15 13:06:13 · 340 阅读 · 0 评论 -
替换空格
找到空格有多少个,从后遍历,遇到空格就替换o(n)复杂度#include #include char str[1111111]; int main() { while(gets(str)) { int cnt=0; int len=strlen(str); for(int i=0;i<len;++i) { if(str[i] == ' ') cnt++;原创 2015-01-31 18:45:06 · 389 阅读 · 0 评论 -
题目1384:二维数组中的查找
判断要查找的数在不在这一行的范围内,然后2分查找就行了#include #include int a[1111][1111]; int n,m; int t; bool fun(int n) { int l=0,r=m-1,mid; while(l <= r) { mid=(l+r)/2; if(a[n][mid] > t) { r=mid-1; } else原创 2015-01-31 18:42:34 · 379 阅读 · 0 评论 -
题目1511:从尾到头打印链表
写的双向链表RE了,不知道肿么了,只好随手改了一个头插#include #include #include typedef struct node { int num; struct node *next; //struct node *pre; }SqList; SqList *creat() { SqList *p1,*p2,*temp; p1=(SqList *)malloc(原创 2015-01-31 19:29:14 · 360 阅读 · 0 评论 -
题目1385:重建二叉树
数据结构题,必须知道中序才能确定树,然后递归就行了。模拟过程如下; 先序:1 2 4 7 3 5 6 8 中序:4 7 2 1 5 3 8 6 先序为1,即根为1,到中序中找到1的位置,然后1左边的为左子树,右边的为右子树 分为2部分: 先序:2 4 7 中序 :7 2 4 先序:3 5 6 8 中序:5 3 8 6 重复前面的步骤,构建树。 而打印树的过程,把根的输原创 2015-02-03 15:42:01 · 433 阅读 · 0 评论 -
题目1386:旋转数组的最小数字
额、、、这题什么意思,直接遍历就出来答案了啊,还转什么转。。。 #include #include int a[2000001]; int main() { int n; while(scanf("%d",&n) != EOF) { int l=0; for(int i=0;i<n;++i) { scanf("%d",&a[i]); if(i != 0)原创 2015-02-03 16:50:44 · 398 阅读 · 0 评论 -
题目1390:矩形覆盖
啊啊啊啊,还是斐波那契数列啊,代码都没敲,因为是2*n,所以放的方式只与前2个放的方式有关。 #include #include int main() { long long f[99]; f[0]=1; f[1]=1; for(int i=2;i<=70;++i) { f[i]=f[i-1]+f[i-2]; } int n; while(scanf("%d",&n) !=原创 2015-02-03 17:25:19 · 321 阅读 · 0 评论 -
题目1512:用两个栈实现队列
创建2个栈,push到栈1,pop栈2,如果栈2为空,就把栈1的数据全部转到栈2, 这样的复杂度比直接暴力要小一些,但感觉直接暴力也能过吧,就不试了。 而如果要用2个队列模拟一个栈的话,先压入队列1,如果有pop,就把队列1转移到队列2,pop最上面的, 然后如果有压入,就压入队列2,有pop就转移队列1,如此循环。。。。无代码,很简单 #include #incl原创 2015-02-03 16:26:20 · 403 阅读 · 0 评论 -
题目1387:斐波那契数列
纯斐波那契数列,没longlong挂了一次。先预处理是为了节省时间,最简单的dp #include #include int main() { long long f[99]; f[0]=0; f[1]=1; for(int i=2;i<=70;++i) { f[i]=f[i-1]+f[i-2]; } int n; while(scanf("%d",&n) != EOF)原创 2015-02-03 16:57:55 · 323 阅读 · 0 评论 -
题目1388:跳台阶
这这这。。。不还是斐波那契数列吗,别以为换个龟壳我就不认识你。 因为只能跳1,,或者2,那么在n这个位置的时候跳的状态只与前面n-1,n-2有关,分别由他们转换来 状态转移方程即:f[n]=f[n-1]+f[n-2];是不是很熟悉呀呀呀 #include #include int main() { long long f[99]; f[0]=1; f[1]=1; for(i原创 2015-02-03 17:00:33 · 300 阅读 · 0 评论 -
题目1389:变态跳台阶
一样一样一样,只是转移的时候2个变成了n个,就把前n-1的和保存下来。。。。就没然后了 #include #include int main() { long long f[66]; f[1]=1; f[2]=2; long long sum=3; for(int i=3;i<=50;++i) { f[i]=sum+1; sum+=f[i]; } int n; whi原创 2015-02-03 17:08:30 · 465 阅读 · 0 评论 -
题目1518:反转链表
改了改双向链表就行了,因为之前写为了AC,就没考虑那么多,其实头指针和尾指针都应该指向NULL的 加上之后就行了。 如果不用双向链表,改单向链表的话,只需要遍历,把next改成pre就行了,the same #include #include #include typedef struct node { int val; struct node *next; struct node原创 2015-02-15 17:12:26 · 323 阅读 · 0 评论 -
题目1519:合并两个排序的链表
写链表就是不停的调。。。发现问题就改。。。蓝后就行了!!! 链表的合并而已 #include #include #include typedef struct node { int val; struct node *next; }Sqlist; int n,m; Sqlist *create(int n) { if(n == 0) return NULL; Sqlist *原创 2015-02-15 19:19:10 · 612 阅读 · 0 评论 -
题目1367:二叉搜索树的后序遍历序列
二叉搜索树:如果左子树不为空,那么左子树的数逗比根的数小,右子树的数比根的数大 从前往后找,比根小的就是左子树(根是最后一个,后序遍历),其余就是右子树,然后递归! #include #include int a[10004]; bool check(int s,int e) { if(s >= e) return true; int p = s; while(p < e && a原创 2015-03-10 20:28:52 · 351 阅读 · 0 评论