今天又从当当购买了一本书 Network Security Secret & Solutions Hacking Exposed,拿到有点小失望,好好的书被整成花销的不行。边和朋友聊天边做了做网易有道的题目,感觉还行,跟baidu比还是小儿科了点,一会就搞完了!!!随让我是用脚盆洗脸的盆盆呢^_^.废话了这么多,看题了
1 打印如下形式的矩阵;
n=5:
1 2 9 10 25
4 3 8 11 24
5 6 7 12 23
16 15 14 13 22
17 18 19 20 21
n=6:
1 2 9 10 25 26
4 3 8 11 24 27
5 6 7 12 23 28
16 15 14 13 22 29
17 18 19 20 21 30
36 35 34 33 32 31
刚开始想往螺旋队列以及奇幻矩阵上靠,结果发现此路不通,那就自己分析了哦!!
1 2 9 10 25
3 8 11 24
7 12 23
13 22
21
这不就是规律,1 = 1*1+1-1
2 = (2-1)*(2-1)+1;
9 = 3*3+1-1
10 = (4-1)*(4-1)+1;
25 = 5*5+1-1
好了我是懒人自己去分析了,思路如此
j>=i的时候:
j为偶数 (j-1)*(j-1)+i;
j为奇数 j*j+1-i;
j
发现时关于行有规律了
i为偶数 i*i+1-j;
i为奇数 (i-1)*(i-1)+j;
#include <stdio.h> #include <stdlib.h>
void printMatrix(int N) { int i =1; int j = 1; for(;i<=N;++i) { for(j=1;j<=N;++j) { if(i<=j) { if(j%2) printf("%d\t",(j-1)*(j-1)+2*j-i); else printf("%d\t",(j-1)*(j-1)+i); } else { if(i%2) printf("%d\t",(i-1)*(i-1)+j); else printf("%d\t",(i-1)*(i-1)+2*i-j); } } printf("\n"); } }
int main(int argc, char *argv[]) { printMatrix(5); system("PAUSE"); return 0; }
|
2. 表达式求值,一个字符串只由'+','-',和‘0’-‘9’组成,并且'+','-'只作为二元
运算符。
bool calculate(const char* exp, int &result);
这题同样也没什么难点,递归,可是这个返回值为bool好像出题者的意思是不想你用递归,ok你让我用,我也不会用,用动态规划正中下怀
直接上程序了:
#include <stdio.h> #include <stdlib.h>
void calculate(char* exp, int* result) { int i = 0; int flag =1; int flag_tmp; int sum =0; while(1) { // printf("exp[%d] is %c\n", i, exp[i]);
if(exp[i]=='-'||exp[i]=='+') { if(exp[i]=='-') flag_tmp=0; else flag_tmp=1; //printf("%c\n", exp[i]);
exp[i]='\0'; printf("exp is %s\n", exp); sum = atoi(exp); printf("sum is %d\n", sum); if(flag==1) *result += sum; else *result -= sum; flag = flag_tmp; exp+=i+1; printf("%c\n", *exp); i=0; } else if(exp[i]=='\0') { sum = atoi(exp); if(flag==1) *result += sum; else *result -= sum; break; } else i++; } }
int main(int argc, char *argv[]) { char str[] = "1+2-3+5+8-9-12+100"; int ret = 0; printf("%s = ", str); calculate(str, &ret); printf("%d\n", ret); system("PAUSE"); return 0; }
|
1:
36匹马赛跑,跑道同时只能容许6匹马。而且36匹马速度不同,但是每次跑的速度恒定。
问,跑多少次可以选出第一,第二,第三名
哈哈,你自己先想想!!!这种题目,你的第一反映的答案肯定是错误的,告诉你把答案就是6次,记录下每匹马跑的时间嘛,空间换时间
2.
给定一个字串X,求它最长字串S,使得S=SR,SR为S的反序,即如果S=abc,则SR=cba
例子:X=abccba,则输出S=abc
回文了...
可以用
解法一:
kmp的next数组解法
解法二:
动态规划的从中往两边走
解法三:
后缀数组
abccba&abccba的最长公共前缀
三种解法我blog里程序都有,今天我自己写的是解法二,今天比较钟情动态规划
#include <stdio.h> #include <stdlib.h>
void max_huiwen(char* str, int* index, int* max) { int len = strlen(str); int start = 0; int end = 0; int left; int right; while(start<len) { end = start; while(end<len-1 && str[end]==str[end+1]) end++; left = start; right = end; while(left-1>=0&&right+1<len&&str[left-1]==str[right+1]) { left--; right++; } if(right-left+1>*max) { *max = right-left+1; *index = left; } start=end+1; } }
int main(int argc, char *argv[]) { char* str = "ababcddcbaaa"; //char str[]="aabcxdefggfedycbaa";
int index = 0; int max = 0; printf("%s\n", str); max_huiwen(str, &index, &max); printf("index:%d, len:%d\n", index, max); system("PAUSE"); return 0; }
|
打完收工,看看我的hacking exposed去了
阅读(6900) | 评论(9) | 转发(0) |