網易2018秋招筆試(彩色磚塊)
阿新 • • 發佈:2019-02-02
小易有一些彩色的磚塊。每種顏色由一個大寫字母表示。各個顏色磚塊看起來都完全一樣。現在有一個給定的字串s,s中每個字元代表小易的某個磚塊的顏色。小易想把他所有的磚塊排成一行。如果最多存在一對不同顏色的相鄰磚塊,那麼這行磚塊就很漂亮的。請你幫助小易計算有多少種方式將他所有磚塊排成漂亮的一行。(如果兩種方式所對應的磚塊顏色序列是相同的,那麼認為這兩種方式是一樣的。)
例如: s = "ABAB",那麼小易有六種排列的結果:
"AABB","ABAB","ABBA","BAAB","BABA","BBAA"
其中只有"AABB"和"BBAA"滿足最多隻有一對不同顏色的相鄰磚塊。
例如: s = "ABAB",那麼小易有六種排列的結果:
"AABB","ABAB","ABBA","BAAB","BABA","BBAA"
其中只有"AABB"和"BBAA"滿足最多隻有一對不同顏色的相鄰磚塊。
輸入描述:
輸入包括一個字串s,字串s的長度length(1 ≤ length ≤ 50),s中的每一個字元都為一個大寫字母(A到Z)。
輸出描述:
輸出一個整數,表示小易可以有多少種方式。
輸入例子1:
ABAB
輸出例子1:
2
這個題千萬不要被這個全排列矇蔽了,然後傻乎乎的去字母計算全排列,筆試時間有限,肯定有簡單的方法。
分析一下:如果只有一種大寫字母,肯定只有一種情況;
如果有兩種大寫字母,全排列出來有6中,符合題意的肯定只有兩種;
如果有三種字母(或者>3種),不同字母緊靠且符合題意的肯定沒有;
所以,顯而易見,三種情況考慮就OK了。
另外在判斷字串有幾種字元的時候,考慮用Set,因為Set中不能包含有重複的元素,最後Set的長度就是字元的種類數;程式碼如下:
package 劍指Offer; import java.util.*; public class 字串全排列 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); String s = sc.next(); char[] ch = s.toCharArray(); Set set = new HashSet<>(); for (int i = 0; i < ch.length; i++) { set.add(ch[i]); } int size = set.size(); if(size == 2){ System.out.println("2"); }else if (size == 1) { System.out.println("1"); }else { System.out.println("0"); } } }