您的位置:首页 > 编程语言 > Java开发

2018科大讯飞Java笔试第一道编程题

2018-04-12 21:45 363 查看

题目

编程题

1、争吵

时间限制:C/C++语言2000MS;其他语言4000MS

内存限制:C/C++语言65536KB;其他语言589824KB

题目描述:

有n 个人排成了一行队列,每个人都有一个站立的方向:面向左或面向右。由于这n 个人中每个人都很讨厌其他的人,所以当两个人面对面站立时,他们会发生争吵,然后其中一个人就会被踢出队列,谁被踢出队列都是有可能的。

我们用字符L 来表示一个面向左站立的人,用字符R 来表示一个面向右站立的人,那么这个队列可以用一个字符串描述。比如RLLR 就表示一个四个人的队列,其中第一个人和第二个人是面对面站立的。他们发生争吵后队列可能会变成LLR,也可能变成RLR;若变成RLR,则第一个人与第二个人还会发生争吵,队列会进一步变成LR 或者RR。

若在某个时刻同时可能有很多的争吵会发生时,接下来只会发生其中的一个,且任意一个都是有可能发生的。

你想知道经过一系列的争吵后,这个队列最少会剩下多少人?

输入

第一行包含一个有字符L 和R 构成的字符串。

1 ≤字符串长度≤ 105

输出

输出队列中最少会剩下多少人。

样例输入

LRRLRL

样例输出

2

Hint

一种可能的变化情况是这样的:

LRRLRL -> LRLRL -> LRRL -> LRL -> LR

解题思路

1、争吵的可能性只有“RL” ,同向“RR”、“LL”,或者反向“LR”,都不可能争吵。

2、需要注意随机踢出,随机留下。

代码

package com.iflytek.test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Quarrel {

//该队列是否有人在争吵
private boolean isQuarrel = true;

public boolean getIsQuarrel() {
return isQuarrel;
}

//初始化队列,随机产生number个人的队列
public String initQueue(int number) {
Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; number > 0; number--) {
boolean isRight = random.nextBoolean();
if (isRight) {
sb.append("R");
} else {
sb.append("L");
}
}
return sb.toString();
}

public String process(String queue) {
System.out.println("目前队列是:" + queue);
StringBuilder sb = new StringBuilder(queue);
int index = -2;
//indexList记录每对"RL"的位置,以方便后面随机删除
List<Integer> indexList = new ArrayList<Integer>();
//每次从“RL”的位置往下寻找,直到把所有的“RL”找出
while ((index = sb.indexOf("RL", index + 2)) >= 0) {
indexList.add(index);
}
//判断找出的结果,如果数量大于0,则说明有人在争吵
if (indexList.size() > 0) {
int length = indexList.size();
Random random = new Random();
//用随机数确定踢出哪一对争吵的人
int randomIndex = random.nextInt(length);
int deleteIndex = indexList.get(randomIndex);
//用随机数确定删除“R”还是“L”
boolean deleteRight = random.nextBoolean();
if (deleteRight) {
sb.delete(deleteIndex, deleteIndex + 1);
} else {
sb.delete(deleteIndex + 1, deleteIndex + 2);
}
System.out.println("该队列有" + length + "对人在争吵,");
System.out.println("踢出了第" + (randomIndex + 1) + "对,");
System.out.println("该对留下了" + (deleteRight ? "L" : "R") + "。\n");
isQuarrel = true;
} else {
System.out.println("该队列没有人在争吵了。\n");
isQuarrel = false;
}

return sb.toString();
}

public static void main(String[] args) {
Quarrel quarrel = new Quarrel();
String queue= quarrel.initQueue(8);
while (quarrel.getIsQuarrel()){
queue = quarrel.process(queue);
}
System.out.println("最后的队列是:"+queue);
System.out.println("剩下了"+queue.length()+"人");
}
}


运行结果

注意:以下只是其中一种结果,因为随机性,同一个队列可能会有许多不同的结果。

目前队列是:LRRLRLLR
该队列有2对人在争吵,
踢出了第1对,
该对留下了R。

目前队列是:LRRRLLR
该队列有1对人在争吵,
踢出了第1对,
该对留下了R。

目前队列是:LRRRLR
该队列有1对人在争吵,
踢出了第1对,
该对留下了R。

目前队列是:LRRRR
该队列没有人在争吵了。

最后的队列是:LRRRR
剩下了5人


以上是在刷牛客网笔试题时候写的代码,写在博客里权当记录和分享,正在苦苦准备面试中。如果博友发现有错误或者有更好的方法还请指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 笔试