牛客网华为机试题说明六

一.  牛客网之华为机试题

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;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值