[HackerRank]Gem Stones

Gem Stones
John 发现了很多种岩石。每种岩石都有一个独一无二成分:由小写英文字母组成。宝石是由一个单一的字符组成,并且将在所有岩石中出现。
给出一些岩石的成分,输出有多少种不同的宝石存在。
输入格式
第一行包含一个整数 N, 代表岩石的个数
接下来的N行,每行包含岩石的构成,由小写的英文字母组成。
输出格式
输出有多少种不同的宝石
数据范围
1 ≤ N ≤ 100
1 ≤ 代表岩石组成的英文单词长度 ≤ 100
样例输入
3
abcdde
baccd
eeabg
样例输出
2
样例解释
只有"a", "b"两种不同的宝石,因为它们包含在每种岩石的成分中。


思路:只需要计算出在各个数组中都出现的字母的个数, 可以用一个长度为26的bit vector来存储字母在各个数组中是否出现,1为出现,0为未出现。

代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Gem_Stones
{
    class Program
    {
        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());
            char[] values;
            List<bool[]> list = new List<bool[]>();

            for (int i = 0; i < N; i++)
            {
                values = Console.ReadLine().ToLowerInvariant().ToCharArray();
                bool[] set = new bool[26];

                InitializedBitVector(values, set);
                list.Add(set);
            }

            bool result = true;
            int count = 0;
            for (int i = 0; i < 26; i++)
            {
                foreach (var s in list)
                {
                    result = s[i];
                    if (!result) break;
                }
                if(result) count++;
                result = true;
            }

            Console.WriteLine(count);
            Console.ReadKey();
        }

        private static void InitializedBitVector(char[] values, bool[] set)
        {
            foreach (var value in values)
            {
                switch (value)
                {
                    case 'a':
                        set[0] = true;
                        break;
                    case 'b':
                        set[1] = true;
                        break;
                    case 'c':
                        set[2] = true;
                        break;
                    case 'd':
                        set[3] = true;
                        break;
                    case 'e':
                        set[4] = true;
                        break;
                    case 'f':
                        set[5] = true;
                        break;
                    case 'g':
                        set[6] = true;
                        break;
                    case 'h':
                        set[7] = true;
                        break;
                    case 'i':
                        set[8] = true;
                        break;
                    case 'j':
                        set[9] = true;
                        break;
                    case 'k':
                        set[10] = true;
                        break;
                    case 'l':
                        set[11] = true;
                        break;
                    case 'm':
                        set[12] = true;
                        break;
                    case 'n':
                        set[13] = true;
                        break;
                    case 'o':
                        set[14] = true;
                        break;
                    case 'p':
                        set[15] = true;
                        break;
                    case 'q':
                        set[16] = true;
                        break;
                    case 'r':
                        set[17] = true;
                        break;
                    case 's':
                        set[18] = true;
                        break;
                    case 't':
                        set[19] = true;
                        break;
                    case 'u':
                        set[20] = true;
                        break;
                    case 'v':
                        set[21] = true;
                        break;
                    case 'w':
                        set[22] = true;
                        break;
                    case 'x':
                        set[23] = true;
                        break;
                    case 'y':
                        set[24] = true;
                        break;
                    case 'z':
                        set[25] = true;
                        break;
                }
            }
        }
    }
}

时间效率:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码中有几个问题: 1. while 循环的判断条件应该是 `stones.length > 1`,因为只有至少有两个石头时才需要进行破碎的操作。所以应该将 `while( stones.length==1 || stones.length==0 )` 修改为 `while( stones.length > 1 )`。 2. 在交换石头的位置时,应该使用临时变量来保存一个石头的值,然后再进行交换。所以应该将 `a=stones[j];` 修改为 `int temp = stones[i];`,将 `stones[i]=stones[j];` 修改为 `stones[i]=stones[j];`,将 `stones[j]=a;` 修改为 `stones[j]=temp;`。 3. 在判断最后剩下的石头重量时,应该使用索引 `stones.length-1` 和 `stones.length-2` 来获取最后两个石头的重量。所以应该将 `if(stones[stones.length-1]<=stones[stones.length])` 修改为 `if(stones[stones.length-1]<=stones[stones.length-2])`,将 `stones.length=stones.length-2;` 修改为 `stones.length -= 2;`。 4. 最后返回的应该是 `stones[0]`,而不是 `stones[stones.length]`。所以应该将 `return stones[stones.length];` 修改为 `return stones[0];`。 修正后的代码如下: ```java class Solution { public int lastStoneWeight(int[] stones) { while (stones.length > 1) { for (int i = 0; i < stones.length; i++) { for (int j = 1; j < stones.length; j++) { if (stones[i] > stones[j]) { int temp = stones[i]; stones[i] = stones[j]; stones[j] = temp; } } } if (stones[stones.length - 1] <= stones[stones.length - 2]) { stones[stones.length - 2] -= stones[stones.length - 1]; stones = Arrays.copyOf(stones, stones.length - 1); } else { stones = Arrays.copyOf(stones, stones.length - 2); } } return stones[0]; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值