一. 牛客网之华为机试题
17. 坐标移动
描述:
开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。
输入:合法坐标为A(或者D或者W或者S) + 数字(两位以内)
坐标之间以;分隔。
非法坐标点需要进行丢弃。如AA10; A1A; $%$; YAD; 等。
下面是一个简单的例子 如:
A10;S20;W10;D30;X;A1A;B10A11;;A10;
处理过程:
起点(0,0)
+ A10 = (-10,0)
+ S20 = (-10,-20)
+ W10 = (-10,-10)
+ D30 = (20,-10)
+ x = 无效
+ A1A = 无效
+ B10A11 = 无效
+ 一个空 不影响
+ A10 = (10,-10)
结果 (10, -10)
数据范围:每组输入的字符串长度满足 1≤n≤10000 1≤n≤10000 ,坐标保证满足 −231≤x,y≤231−1 −231≤x,y≤231−1 ,且数字部分仅含正数
输入描述:一行字符串
输出描述:最终坐标,以逗号分隔
示例1
输入:A10;S20;W10;D30;X;A1A;B10A11;;A10;
输出:10,-10
实现思路:输入时隔离到 分号 ;这个符号,使用一个 buf[4]的数组,每次输入三个字符。
首先,排除掉非法字符;
其次,进行坐标移动;
代码实现如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int x = 0;
int y = 0;
char input[4] = {0};
while(1)
{
if(scanf("%[^;]", input) == EOF)
{
break;
}
getchar(); //去掉分号;
//除去不合法的数据格式
if(strlen(input) > 3)
continue;
if(input[0]!= 'A' && input[0] != 'D' && input[0]!= 'W' && input[0] != 'S')
continue;
if(input[1] < '0' || input[1] > '9')
continue;
if(strlen(input) == 3)
{
if(input[2] < '0' || input[2] > '9')
continue;
}
//进行坐标移动
switch (input[0])
{
case 'A':
x -= atoi(&input[1]);
break;
case 'D':
x += atoi(&input[1]);
break;
case 'W':
y += atoi(&input[1]);
break;
case 'S':
y -= atoi(&input[1]);
break;
default:
break;
}
}
printf("%d,%d", x,y);
return 0;
}
18. 密码验证合格程序
描述
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)
数据范围:输入的字符串长度满足 1≤n≤100 1≤n≤100
输入描述:一组字符串。
输出描述:如果符合要求输出:OK,否则输出NG
代码实现思路:
首先,排除长度 <= 8的字符串。
如果长度满足,进行类型判断,即排除格式不满足的字符串。
前两者满足的情况下,最后判断长度大于2的重复子串。
代码实现如下:
#include <stdio.h>
#include <string.h>
int main(void)
{
char buf[1000] = {0};
int i = 0,j= 0;
int len = 0;
int a1 = 0,a2 = 0,a3 = 0,a4 = 0;
int flag = 0;
while(gets(buf))
{
//首先,判断长度
len = strlen(buf);
if(len < 9)
printf("NG");
else
{
//其次,判断格式是否满足
for(i=0; i<len; i++)
{
if(buf[i] >= 'a' && buf[i] <= 'z')
a1 = 1;
else if(buf[i] >= 'A'&& buf[i] <= 'Z')
a2 = 1;
else if(buf[i] >= '0' && buf[i] <= '9')
a3 = 1;
else{ //其他符号
a4 = 1;
}
}
if((a1+a2+a3+a4) < 3)
printf("NG");
else //最后,处理长度大于2的重复的子串
{
flag = 0;
for(i=0; i<len/2; i++)
{
for(j = i+3; j< len-3; j++)
{
if(buf[i]==buf[j] && buf[i+1]==buf[j+1] && buf[i+2]==buf[j+2])
flag = 1;
}
}
if(flag == 1)
printf("NG");
else
printf("OK");
}
}
}
return 0;
}