华为机试题 坐标移动

题目描述

开发一个坐标计算工具, 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)

输入描述:

一行字符串

输出描述:

最终坐标,以,分隔

输入例子:
A10;S20;W10;D30;X;A1A;B10A11;;A10;

输出例子:
10,-10

来源: http://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29?tpId=37&tqId=21240&rp=&ru=/ta/huawei&qru=/ta/huawei/question-ranking

该题先预处理一下,取得所有的指令的列表,再一次处理会比较简单

然后根据题意,正常的指令要么是3个字符A10   要么是2个字符  A1

所以根据指令的长度先排除一些错误指令,然后根据指令的特点继续排除和处理指令

这道题需要注意是要考虑处理多行指令,所以最外层要有while循环


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

#include<iostream>

#include<vector>

using namespace std;

int main(){

    string s;

    while(getline(cin,s))

    {

        int heng=0;

        int zong=0;

        string temp;

        vector<string> vs;

        temp.clear();

        for(int i=0;i<s.size();i++){

            if(s[i]==‘;‘){

                vs.push_back(temp);

                temp.clear();

            }

            else{

                temp.push_back(s[i]);

            }

        }

        for(int i=0;i<vs.size();i++)

        {

            if(vs[i].size()==2 || vs[i].size()==3) 

            {

                if(vs[i][0]==‘A‘ || vs[i][0]==‘W‘ || vs[i][0]==‘S‘ || vs[i][0]==‘D‘)

                {

                    if(vs[i].size()==2){

                        if(vs[i][1]>=‘0‘ && vs[i][1]<=‘9‘)

                        {

                            if(vs[i][0]==‘A‘)

                                heng=heng-(vs[i][1]-‘0‘);

                            else if(vs[i][0]==‘D‘)

                                heng=heng+(vs[i][1]-‘0‘);

                            else if(vs[i][0]==‘W‘)

                                zong=zong+(vs[i][1]-‘0‘);

                            else if(vs[i][0]==‘S‘)

                                zong=zong-(vs[i][1]-‘0‘);  

                        }

                        else

                            continue;

                    }

                    else if(vs[i].size()==3){

                        if(vs[i][1]>=‘0‘ && vs[i][1]<=‘9‘ && vs[i][2]>=‘0‘ && vs[i][2]<=‘9‘)

                        {

                            if(vs[i][0]==‘A‘)

                                heng=heng-(vs[i][1]-‘0‘)*10-(vs[i][2]-‘0‘);

                            else if(vs[i][0]==‘D‘)

                                heng=heng+(vs[i][1]-‘0‘)*10+(vs[i][2]-‘0‘);

                            else if(vs[i][0]==‘W‘)

                                zong=zong+(vs[i][1]-‘0‘)*10+(vs[i][2]-‘0‘);

                            else if(vs[i][0]==‘S‘)

                                zong=zong-(vs[i][1]-‘0‘)*10-(vs[i][2]-‘0‘);

                        }

                        else

                            continue;

                    }

                }

                else

                    continue;

            }

            else

                continue;

        }

        cout<<heng<<","<<zong<<endl;

        s.clear();

    }

}

来自为知笔记(Wiz)

时间: 2024-08-09 02:03:54

华为机试题 坐标移动的相关文章

2017华为机试题--水仙花数

等了一个月终于等到华为给安排的实习生在线机试,把自己做的三道题记录了一下,也方便日后复习.这篇是第一题,没有什么特别的难度,经典的水仙花数题. 题目描述:水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身.(例如:13+53+33=153),要求:输出1000范围内所有水仙花数及水仙花数之和. 输入描述:无 输出描述:1000以内所有水仙花数及总和. 输出例子: 第1个水仙花数:xxx 第2个水仙花数:xxx 第3个水仙花数:xxx ... 水仙花数总和为:xxx 1 p

华为机试题【12】-关灯泡

题目描述: 描述: 一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着. 有n个学生从长廊穿过.第一个学生把号码凡是1的倍数的电灯的开关拉一下:接着第二个学生把号码凡是2的倍数的电灯的开关拉一下:接着第三个学生把号码凡是3的倍数的电灯的开关拉一下:如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下.n个学生按此规定走完后,长廊里电灯有几盏亮着. 注:电灯数和学生数一致. 运行时间限制: 无限

华为机试题3

[编程题] 明明的随机数 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数 字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序,按照排好的顺序去找同学做调查.请你协助明明完成 “去重”与“排序”的工作. Input Param n               输入随机数的个数 inputArray      n个随机整数组成的数组 Return Value

华为机试题【10】-求数字基root

题目描述: 求整数的Root:给定正整数,求每位数字之和;如果和不是一位数,则重复; 输入:输入任意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行对应一个输入数据的结果. 样例输入: 25 865 样例输出: 7 1 思路分析: 首先求个位数相加,经典方法,求余相除 要求各个位数的和是小于10,可以采用递归或者循环 代码: import java.util.Scanner; public class Main { static int[] num

华为机试题【11】-报数删除人

题目描述: 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出,问最后留下的那位是原来第几号. 思路分析: 首先是选好数据结构,轻量级的boolean数组,下边代表序号,全部初始化位true 退出变为false,设置全局变量int a,遍历数组,a++(当对应为false时候,continue跳过) 遍历数组统计true的数量,为1时候退出 注意: 如果要用List来存储,注意遍历remove删除时候,要一致,不能list和iterator混用 代码: import

华为机试题【3】

题目: 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):) 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER 请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR 基

华为机试题【13】-wave数组找字母游戏

题目描述: Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.如上图,假设给定单词if,你必须先吃掉i然后才能吃掉f. 但现在你的任务可没有这么简单,你现在处于一个迷宫Maze(n×m的矩阵)当中,里面到处都是以字母标注的食物,但你只能吃掉能连成给定单词W的食物. ,指定W为"SOLO",则在地图中红色标注了单词"SOLO". 注意区分英文字母大小写,你只能上下左右行走. 运行时间限制: 无限制 内存限制: 无限制 输

华为机试题【9】-整数分割为2的幂次

题目描述: 一个整数可以拆分为2的幂的和,例如: 7 = 1+ 2 + 4 7 = 1 + 2 + 2 + 2 7 = 1 + 1 + 1 + 4 7 = 1 + 1 + 1 + 2 + 2 7 = 1 + 1 + 1 + 1 + 1 + 2 7 = 1 + 1 + 1 + 1 + 1 + 1 + 1 总共有六种不同的拆分方式 再比如: 4可以拆分成: 4 = 4, 4 = 1+1+1+1, 4 = 2+2, 4 = 1+1+2. 用f(n)表示n的不同拆分的种数,例如f(7) = 6. 要求:

华为机试题【1】

题目描述: 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据. 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目. 学生ID编号从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩 接下来又M行,每一行有一个字符C(只取'Q'或'U'),和两个正整数A,B,当C为'Q'