彩色的砖块

题目描述

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

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

例如: 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));
    }
}

 

posted @ 2019-04-15 17:13  坦荡的火星  阅读(242)  评论(0编辑  收藏  举报