彩色的砖块
题目描述
小易有一些彩色的砖块。每种颜色由一个大写字母表示。各个颜色砖块看起来都完全一样。现在有一个给定的字符串s,s中每个字符代表小易的某个砖块的颜色。小易想把他所有的砖块排成一行。
如果最多存在一对不同颜色的相邻砖块,那么这行砖块就很漂亮的。请你帮助小易计算有多少种方式将他所有砖块排成漂亮的一行。(如果两种方式所对应的砖块颜色序列是相同的,那么认为这两种方式是一样的。)
例如: s = "ABAB",那么小易有六种排列的结果:
"AABB","ABAB","ABBA","BAAB","BABA","BBAA"
其中只有"AABB"和"BBAA"满足最多只有一对不同颜色的相邻砖块。
输入描述:
输入包括一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),s中的每一个字符都为一个大写字母(A到Z)。
输出描述:
输出一个整数,表示小易可以有多少种方式。
示例1
输入
ABAB
输出
2
这道题目中字符串由几种形式:
1.字符串的字符种类为1时,结果为1。
2.字符串的字符种类为2时,结果为2。
3.字符串的字符种类大于2时,结果为0。
所以我们要对字符串中出现的字符进行统计,
但是注意的是没必要全部统计完,
当出现大于2种时,就可以结束统计了。
1.方法一:
使用count变量记录出现的字符种类个数。
使用temp1变量来保存第一个出现的字符
使用temp2变量来保存第二个出现的字符,
之所以保存这两个变量,为了便于比较是否第三个字符。
import java.util.Scanner;
public class ColorfulBricks {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
// 输入一个字符串
String str = scn.next();
// 计算器,计算出现的字符种类
int count = 0;
char temp1 = '0';
char temp2 = '0';
for (int i = 0; i < str.length(); i++) {
char temp = str.charAt(i);
if (temp1 == '0') {
count++;
temp1 = temp;
} else {
if (temp2 == '0' && temp != temp1) {
count++;
temp2 = temp;
}
}
if (count == 2 && (temp != temp1 && temp != temp2) ) {
count++;
break;
}
}
System.out.println(count == 1 ? 1 : (count == 2 ? 2 : 0));
}
}
2.方法二,由前面的方法,会出现很多次的比较,后来想了想,
只需要记录字符是否出现,不需要记录出现的次数,
可以使用int类型的32位保存。
关键代码:key = key | 1<<(temp - 'A');
使用位或操作,新字符会在字符中以1的形式表示。
import java.util.Scanner;
public class ColorfulBricks {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
// 输入一个字符串
String str = scn.next();
// 记录状态
int key = 0;
int count = 0;
for(int i=0;i<str.length();i++) {
char temp = str.charAt(i);
key = key | 1<<(temp - 'A');
count = comparetor(key);
if(comparetor(key) > 2) {
break;
}
}
System.out.println(count == 1 ? 1 : (count == 2 ? 2 : 0));
}
// 计算整型key中出现的1的个数。
public static int comparetor(int n) {
int count = 0;
while (n != 0)
{
n &= (n-1);
count++;
}
return count;
}
}
方法三:
使用与操作,不需要计算当前key中1的个数。
import java.util.Scanner;
public class ColorfulBricks {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
// 输入一个字符串
String str = scn.next();
// 记录状态
int key = 0;
int count =0;
for(int i=0;i<str.length();i++) {
char temp = str.charAt(i);
num = key & 1<<(temp - 'A');
if(num == 0) count++;
if(count > 2) {
break;
}
}
System.out.println(count == 1 ? 1 : (count == 2 ? 2 : 0));
}
}