2018科大訊飛校招---爭吵
阿新 • • 發佈:2019-01-25
題目描述:
有 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)); } } }