1. 程式人生 > >2018科大訊飛校招---爭吵

2018科大訊飛校招---爭吵

題目描述:

有 n 個人排成了一行佇列,每個人都有一個站立的方向:面向左或面向右。由於這 n 個人中每個人都很討厭其他的人,所以當兩個人面對面站立時,他們會發生爭吵,然後其中一個人就會被踢出佇列,誰被踢出佇列都是有可能的。

我們用字元 L 來表示一個面向左站立的人,用字元 R 來表示一個面向右站立的人,那麼這個佇列可以用一個字串描述。比如 RLLR 就表示一個四個人的佇列,其中第一個人和第二個人是面對面站立的。他們發生爭吵後佇列可能會變成 LLR,也可能變成 RLR;若變成 RLR,則第一個人與第二個人還會發生爭吵,佇列會進一步變成 LR 或者 RR。
 
若在某個時刻同時可能有很多的爭吵會發生時,接下來只會發生其中的一個,且任意一個都是有可能發生的。
 
你想知道經過一系列的爭吵後,這個佇列最少會剩下多少人?

輸入

第一行包含一個有字元 L 和 R 構成的字串。
1 ≤字串長度≤ 105

輸出
輸出佇列中最少會剩下多少人。

樣例輸入
LRRLRL
樣例輸出
2

Hint
一種可能的變化情況是這樣的:
LRRLRL -> LRLRL -> LRRL -> LRL -> LR

思路一:遍歷,第一遍將RL標記為XX,接著若有RX,XL也標記為XX,判斷條件:再一次遍歷後X個數不變,將相連的X的長度記為1加上其他不為X的個數。

思路二:只有當R全都在L的右邊時,才不會發生爭吵。故找到最左邊的R和最右邊的L,將位於兩者中間的所有元素去除即為不發生爭吵的最少人數。

程式碼:

import java.util.Scanner;

public class Test1 {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        char[] chars = str.toCharArray();
        int r = -1;
        int l = -1;
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == 'R') {
                r = i;
                break;
            }
        }
        for (int i = chars.length - 1; i >= 0; i--) {
            if (chars[i] == 'L') {
                l = i;
                break;
            }
        }
        
        if (r == -1||l == -1) {
        	System.out.println(chars.length);
		}else if (r>l) {
			System.out.println(chars.length);
		}else {
	        System.out.println(chars.length - (l - r));
		}
    }
}