题目描述

小易有一些彩色的砖块。每种颜色由一个大写字母表示。各个颜色砖块看起来都完全一样。现在有一个给定的字符串s,s中每个字符代表小易的某个砖块的颜色。小易想把他所有的砖块排成一行。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

如果最多存在一对不同颜色的相邻砖块,那么这行砖块就很漂亮的。请你帮助小易计算有多少种方式将他所有砖块排成漂亮的一行。(如果两种方式所对应的砖块颜色序列是相同的,那么认为这两种方式是一样的。)

例如: s = "ABAB",那么小易有六种排列的结果:

"AABB","ABAB","ABBA","BAAB","BABA","BBAA"

其中只有"AABB"和"BBAA"满足最多只有一对不同颜色的相邻砖块。

输入描述:

输入包括一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),s中的每一个字符都为一个大写字母(A到Z)。

输出描述:

输出一个整数,表示小易可以有多少种方式。

示例1

输入

ABAB

输出

这道题目中字符串由几种形式:

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)); } }

 

 彩色的砖块 随笔

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄