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

题目

编程题
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人

以上是在刷牛客网笔试题时候写的代码,写在博客里权当记录和分享,正在苦苦准备面试中。如果博友发现有错误或者有更好的方法还请指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值