接上一篇帖子
第一题:密码合法性校验(点击展开)
题目描述
随着网络信息化应用的不断推进,网络安全问题越来越被重视。在网络和系统安全领域中,设置复杂的密码是提高网络安全最简单最有效的方式。基于上述原因,大多数统规定用户的密码长度和复杂度必须满足下述条件:
1、密码由英文大小写字母、数字以及特殊符号组成,其中特殊符号只能是:
@ # $ % ^ & * + / = ! ? - _ ( )
2、密码最短8个字符,最长20个字符。
3、密码必须包含下列类型中的任意3类:1)大写字母;2)小写字母;3)数字;4)特殊字符。
请编写一段程序,用于验证输入的密码是否符合系统要求。
输入
一串字符,如My#Password
输出
如果密码符合要求输出true,否则输出false
如输入This8Password ,输出true,输入Pass123 ,输出false
样例输入
This8Password
样例输出
true
感觉就是简单的匹配,自己代码结果未知
第一题自己的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #include <stdio.h> #include <string.h> char code[16] = {'@', '#', '$', '%', '^', '&', '*', '+', '/', '=', '!', '?', '-', '_', '(', ')'}; bool type[4] = {0}; int check(char a){ if (a >= '0' && a <= '9'){ return 0; } if (a >= 'A' && a <= 'Z'){ return 1; } if (a >= 'a' && a <= 'z'){ return 2; } for (int i = 0; i < 16; ++i){ if (a == code[i]){ return 3; } } return -1; } int main(){ char buf[500]; while(scanf("%s", buf) != EOF){ for (int i = 0; i < 4; ++i){ type[i] = 0; } bool y = true; int len = strlen(buf); if (len < 8 || len > 20){ printf("false\n"); continue; } for (int i = 0; i < len; ++i){ int r = check(buf[i]); if (r < 0){ y = false; break; } type[r] = true; } int sum = type[0]; for (int i =1; i < 4; ++i){ sum += type[i]; } if (y && sum > 2){ printf("true\n"); }else{ printf("false\n"); } } return 0; } |
第二题:把数组排成最小的数
题目描述
输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
如给定数组:{2,1}
则排出的最小数字为:12
输入
输入为字符串,其格式为“{数字,数字,……}”
输出
排出的最小数字
样例输入
{2,1}
样例输出
12
一开始想着,就是把数当字符串来排序输出就行了
多想一下,发现其实是很复杂的问题,例如{21,2}就应输出212,而非按字典序的221
网上搜了下,是百度09年的面试题
大体思路依然是字符串排序,只不过在决定A,B次序时,只需比较AB、BA这两个字符串哪个更小,若AB小于BA,则在最小序列里,A一定在B的前面。
证明看网上写了一大堆,真啰嗦。我认为,若AB小于BA,则对于任意串x,y,z,显然有xAyBz小于xByAz,有这个结论就足够了。
不过这个思路实在是很难想到。
第二题自己的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include <stdio.h> #include <stdlib.h> #define MAXNUM 200 #define NUMLEN 200 char num[MAXNUM][NUMLEN]; int n = 0; int cmp(const void *a, const void *b){ char* c1 = (char*)a; char* c2 = (char*)b; int i; for (i = 0; i < 2;){ if (*c1 != *c2){ return *c1 - *c2; } ++c1; ++c2; if (*c1 == '\0'){ ++i; c1 = (char*)b; } if (*c2 == '\0'){ c2 = (char*)a; } } return 0; } int main(){ char tmp; int i, pos = 0; while(scanf("%c", &tmp) != EOF){ if (tmp >= '0' && tmp <= '9'){ num[n][pos++] = tmp; }else{ num[n++][pos] = '\0'; pos = 0; if (tmp == '}'){ getchar(); qsort(num, n, sizeof(char)* NUMLEN, cmp); for (i = 0; i < n; ++i){ printf("%s", num[i]); } printf("\n"); n = 0; } } } return 0; } |
第三题:以最节省的方式完成全程
题目描述
电瓶车行到终点过程中有N个充电站,每个充电站的价格是不同的,每度电可运行的距离固定。请以最节省方式骑完全程。
在起始的时候每个电瓶车的电量是满的,此部分价格不算入总价格
输入
输入参数为电瓶车能够存储电量的大小,终点距起点的距离,每度电可运行的距离,充电站个数,充电站列表。
其中充电站列表包括该充电的每度价格和距起点的距离
充电站列表的结构
{
Int nPrize;//每度电单价
int nDist;//离出发点距离
}
注意,充电站的结构请按照字符串的方式进行解析
输出
输出:如果可以达到终点,则输出运行的距离和花费;如果不能运行到达终点,则输出可运行的最大距离和花费
样例输入
10 20 1 2 {1,5} {2,15}
样例输出
20 15
完全没思路的一道题,一开始还想dp做的,但是状态不太好写(到达某站点下的最小代价和剩余电力都要考虑,多了的电又不能换钱)
后来就用如下土策略试试:
到达某站时:
1.如果剩余电量能到达后面电力更便宜的一个站,就开过去
2.如果1不符合,但是如果能够在该站加电,到达后面电力更便宜的一个站,就加电开过去,使得抵达时电力恰好用完
3.如果1,2都不符合,就在这个站加满电,然后跑到下一个站。若能抵达终点,就直接到终点
没法证明最优解,不过居然AC了
第三题自己的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include <stdio.h> #include <stdlib.h> double max, dist, cost; int sNum; typedef struct{ int nPrize; int nDist; }Station; Station s[100000]; int cmp(const void*a, const void*b){ return (*(Station*)a).nDist - (*(Station*)b).nDist; } int main(){ char tmpc; while(scanf("%lf%lf%lf%d", &max, &dist, &cost, &sNum) != EOF){ for (int i = 0; i < sNum; ++i){ scanf("%c", &tmpc); scanf("{%d,%d}", &s[i].nPrize, &s[i].nDist); } qsort(s, sNum, sizeof(Station), cmp); if (cost == 0){ printf("%d %d\n", dist, 0); continue; } if (sNum == 0 || dist <= max / cost){ printf("%d %d\n", max/cost > dist? dist : max/cost, 0); continue; } if (s[0].nDist > max/cost){ printf("%d %d\n", max/cost, 0); } int ind = 0; double cur = max - s[0].nDist * cost; double len = s[0].nDist; double money = 0; while(true){ int j; bool done = false; for (j = ind + 1; j < sNum && (s[j].nDist - s[ind].nDist) / cost <= cur; ++j){ if (s[j].nPrize <= s[ind].nPrize){ len = s[j].nDist; cur -= (s[j].nDist - s[ind].nDist) * cost; ind = j; done = true; break; } } if (done){ continue; } for (; j < sNum && (s[j].nDist - s[ind].nDist) * cost <= max; ++j){ if (s[j].nPrize <= s[ind].nPrize){ len = s[j].nDist; money += ((s[j].nDist - s[ind].nDist) * cost - cur) * s[ind].nPrize; cur = 0; ind = j; done = true; break; } } if (done){ continue; } if ((dist - len) * cost <= max){ money += ((dist - len) * cost - cur) * s[ind].nPrize; len = dist; break; }else{ money += (max - cur) * s[ind].nPrize; cur = max; if (ind == sNum - 1){ len += max / cost; break; }else{ ++ind; cur -= (s[ind].nDist - len) * cost; len = s[ind].nDist; } } } printf("%d %d\n", int(len), int(money)); } } |
一条评论
你要是参加第二场就好了。PS:贴源码要有注释,3Q。