首页 > 试题广场 >

争吵

[编程题]争吵
  • 热度指数:1038 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解

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


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


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


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


输入描述:

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

1 ≤字符串长度≤ 105



输出描述:
输出队列中最少会剩下多少人。
示例1

输入

LRRLRL

输出

2

说明

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

LRRLRL -> LRLRL -> LRRL -> LRL -> LR
这道题的答案是不是有问题呀?!我觉得应该是这样:如果‘L’和‘R’字符的个数只要都不等于
输入字符串的长度,即字符‘L’和‘R’的个数都大于等于1,则最后最少就都只会剩下一个字符! 

import java.util.Scanner;

public class Main {     public static void main(String[] args) {                  Scanner input = new Scanner(System.in);         String str = input.next();         int length1 = 0;         int length2 = 0;         for(int i = 0; i < str.length(); i++) {             if(str.charAt(i) == 'L')                 length1++;             else                 length2++;         }         if(length1 == str.length() || length2 == str.length()) {             System.out.println(str.length());         }         else             System.out.println(1);         input.close();     }

}

发表于 2019-04-25 12:29:29 回复(1)
queue = input()
length = 1
for i in range(len(queue)-1):
    if queue[i] == 'L':
        length += 1
    else:
        break

for i in range(len(queue)-1):
    if queue[-i-1] == "R":
        length += 1
    else:
        break

if len(queue) == 0:
    print(0)
else:
    print(length)
    
思路比较简单,先分析一下,可以发现从前往后第一个R和从后往前第一个L中间的全部被剔除,并且这一对RL也会被踢掉一个,剩余的长度即为所求。

在自己的编译器上跑通过,但是样例始终不让我过!?把出错样例复制进编译器,同样通过。感觉这题本身有问题?
发表于 2019-04-09 13:10:45 回复(2)
#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin>>s;
    int res=0;
    for(int i=0;i<s.size()-1;i++)
        if(s[i]!=s[i+1])
            res++;
    cout<<s.size()-res<<endl;
    return 0;
}

发表于 2019-06-27 16:05:46 回复(0)

我理解的是左边朝左的和右边朝右的全部留下了,中间留一个
LLRLRRRLRRR
剩下LLRRRR或LLLRRR
但是没通过
说没有输入输出数据
哪位大佬帮忙看看
n=list(input())
x=0
for i in n:
    if i=='L':
        x=x+1
    else:
        break
for i in range(len(n)):
    if n[len(n)-i-1]=='R':
        x+=1
    else:
        break
print(x+1)
发表于 2020-06-25 16:50:22 回复(0)
LRRLRL -> LRLRL -> LRRL -> LRL -> L
最后这一步,一次踢了两个人?不是说踢其中的一个?
发表于 2019-08-21 22:37:56 回复(0)

import java.util.*;

//牛客笔试专用类
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        String string = scanner.nextLine();
        int left, right;
        for (left = 0; left < string.length(); left++) {
            if (string.charAt(left) == 'R')
                break;
        }
        for (right = string.length() - 1; right >= 0; right--) {
            if (string.charAt(right) == 'L')
                break;
        }
        if (left < right) {
            System.out.println(string.length() - right + left);
        }else {
            System.out.println(string.length());
        }


    }

}

发表于 2019-08-09 14:52:23 回复(0)
题目都看不懂 服了自己了 哎哎
发表于 2019-06-01 13:35:13 回复(0)
import re
string = input()

cp = re.compile('RL')

while re.findall(cp,string):
    tmp = string
    string = ''
    for part in tmp.split('RL'):
        if string == '':
            string = part
        elif part == '':
            string = string + 'L'
        elif string[-1] == 'R':
            string = string + 'L' + part
        elif part[0] == 'L':
            string = string + 'R' + part
        else:
            string = string + 'L' + part

print(len(string))
充分考虑到了合并是的几种是需要情况,最开始的时候string为空就直接赋值,RL在最后一位就是L,因为最后第二位是R的话,就又可以踢出去一人,同理string的最后一位是R,后面接L,和part第一位为L,前面接R,万一都不匹配直接接L都是为了凑成RL。最后身下LLLLLRRR。
而通过的题目都是只考虑前后不一致就进行计数,这是题目有问题,还是我理解有问题???
发表于 2019-03-06 14:05:23 回复(1)
以下是能够通过测试的代码:
*******************************************
cin >> str;
n = str.length();
int count = 0;
for(int i = 0;i < n - 1;i++)
{
if(str[i] != str[i-1])
count++;
}
cout << n - count + 1 <<endl;
**********************************************
这代码连样例都过不了,是怎么通过其他测试点的??????
编辑于 2019-02-21 17:21:53 回复(0)
这题,我的理解是,字符串从左往右,只要是以R开头,L结尾的子串,可争吵成只剩一个R或L的字符。
如LRRLRL,可变换成L{RRLRL},最终可变成LL或LR。
按照这种思路,给出的代码不能通过..求解..
  Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int start = s.indexOf("R");
        int end = s.lastIndexOf("L");
        if(end==-1||start==-1||start>end){
            System.out.println(s.length());
        }else {
            System.out.println(s.length()+start-end);
        }

发表于 2019-02-14 12:31:16 回复(1)