今天开始练习一下算法和mysql等题目,增加一下自己的算法能力。
链接:https://www.nowcoder.com/questionTerminal/fc72d3493d7e4be883e931d507352a4a?toCommentId=6159662
来源:牛客网
[编程题]迷路的牛牛
- 热度指数:43429 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
- 算法知识视频讲解
牛牛去犇犇老师家补课,出门的时候面向北方,但是现在他迷路了。虽然他手里有一张地图,但是他需要知道自己面向哪个方向,请你帮帮他。
输入描述:
每个输入包含一个测试用例。 每个测试用例的第一行包含一个正整数,表示转方向的次数N(N<=1000)。 接下来的一行包含一个长度为N的字符串,由L和R组成,L表示向左转,R表示向右转。
输出描述:
输出牛牛最后面向的方向,N表示北,S表示南,E表示东,W表示西。
示例1
输入
3 LRR
输出
E
package com.shengxi.niuke;
import java.util.Scanner;
/**
* 使用两个枚举类,分别作为左右转和方向的变量。
* 这里可以直接使用静态变量,或者数组进行变量储存。本人使用枚举只是因为想练习一下枚举的使用。
* 然后计算出左转和右转的数量,相减抵消,剩下的就是最后的转动次数
*
* @author yan
*/
public class Day001 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//个数
int count = scanner.nextInt();
String line = scanner.next();
char[] chars = line.toCharArray();
int lNum = 0, rNum = 0;
for (char aChar : chars) {
if (aChar == TurnEnum.L.getValue()) {
lNum++;
} else {
rNum++;
}
}
/**因为我使用的右转作为标准,这里有一个难点就是负数的求模也是负数,所以需要加上一个模*/
int result = (rNum - lNum) % 4;
if (result < 0) {
result += 4;
}
printf(result);
}
/**
* 输出
*/
public static void printf(int result) {
//利用switch输出,原因有两个。一个是switch更加明了,第二个是因为练习枚举的使用.
switch (Direction.getByValue(result)) {
case E:
System.out.println(Direction.E);
break;
case N:
System.out.println(Direction.N);
break;
case S:
System.out.println(Direction.S);
break;
case W:
System.out.println(Direction.W);
break;
default:
break;
}
}
/**
* 方向
* 默认0,1,2,3
*/
private enum Direction {
E(1),
S(2),
W(3),
N(0);
private final int value;
Direction(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public static Direction getByValue(int value) {
for (Direction d :
values()) {
if (d.getValue() == value) {
return d;
}
}
return null;
}
}
/**
* 左转右转枚举
*/
private enum TurnEnum {
L('L'), R('R');
private final char value;
TurnEnum(char value) {
this.value = value;
}
public char getValue() {
return value;
}
}
}
如果有更好的方案或者不明白的可以讨论一下哦!