1. 程式人生 > >網易2018秋招筆試(彩色磚塊)

網易2018秋招筆試(彩色磚塊)

小易有一些彩色的磚塊。每種顏色由一個大寫字母表示。各個顏色磚塊看起來都完全一樣。現在有一個給定的字串s,s中每個字元代表小易的某個磚塊的顏色。小易想把他所有的磚塊排成一行。如果最多存在一對不同顏色的相鄰磚塊,那麼這行磚塊就很漂亮的。請你幫助小易計算有多少種方式將他所有磚塊排成漂亮的一行。(如果兩種方式所對應的磚塊顏色序列是相同的,那麼認為這兩種方式是一樣的。)
例如: 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");
		}
}
}