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人
以上是在刷牛客网笔试题时候写的代码,写在博客里权当记录和分享,正在苦苦准备面试中。如果博友发现有错误或者有更好的方法还请指教。
相关文章推荐
- 2018科大讯飞在线笔试题(编程题部分)
- 京东2018校招在线笔试编程题①
- 常见java笔试-编程题
- 网易2018内推Java开发工程师笔试题----操作序列
- 2017阿里,百度,京东java面试+笔试大合集,2018的你会吗?
- 一道JAVA笔试编程题
- 2018网易内推笔试编程题(一)
- 2017年爱奇艺校招Java研发笔试编程题(2个)
- (网易2018校招笔试)[编程题] 字符串碎片
- 360在线笔试编程题2018
- 2018招商银行春招笔试编程题第二题
- 2018搜狐内推笔试编程题2
- [网易2018校招java笔试题]字符串碎片(java语言实现)
- 阿里笔试题(2017在线编程题)-- 数串分组 --Java实现
- 【2018校招美团内推笔试编程题1】K的倍数
- 2018美团点评内推笔试编程题2
- 编程题(1):笔试题-京东软件测试2018实习招聘
- 2018阿里秋招在线编程题(Java开发工程师)
- 2018招商银行春招笔试编程题第一题
- 8月2日网易笔试8道编程题-java代码