Java每日精进·45天挑战·Day10

第一部分:在Java中统计宝石数量

 

 


在编程中,字符串操作是一个常见的任务。今天,我们将讨论一个关于字符串匹配的问题:给定一个代表宝石类型的字符串 jewels 和一个代表你所拥有的石头类型的字符串 stones,我们需要统计 stones 中有多少石头是宝石。

这个问题看似简单,但它考察的是字符串遍历和字符匹配的基本技巧。我们将使用Java语言来实现这个解决方案。

问题描述
  • 输入:两个字符串 jewels 和 stones
  • 输出:一个整数,表示 stones 中宝石的数量。
  • 字母区分大小写:例如,"a" 和 "A" 被视为不同类型的石头。
示例
  1. 输入jewels = "aA"stones = "aAAbbbb"
    • 输出:3
  2. 输入jewels = "z"stones = "ZZ"
    • 输出:0
提示
  • 1 <= jewels.length, stones.length <= 50
  • jewels 和 stones 仅由英文字母组成
  • jewels 中的所有字符都是唯一的
解决方案

我们可以使用一个简单的方法来解决这个问题:遍历 stones 字符串中的每个字符,并检查它是否在 jewels 字符串中出现。如果出现,则宝石计数器加一。

下面是具体的Java代码实现:

public class JewelCounter {
    public static int numJewelsInStones(String jewels, String stones) {
        int count = 0;
        // 将 jewels 字符串转换为一个 HashSet,以提高查找效率
        HashSet jewelSet = new HashSet<>();
        for (char jewel : jewels.toCharArray()) {
            jewelSet.add(jewel);
        }
        
        // 遍历 stones 字符串中的每个字符
        for (char stone : stones.toCharArray()) {
            // 如果当前石头字符在 jewels 集合中,则增加计数
            if (jewelSet.contains(stone)) {
                count++;
            }
        }
        
        return count;
    }

    public static void main(String[] args) {
        String jewels = "aA";
        String stones = "aAAbbbb";
        System.out.println("Number of jewels: " + numJewelsInStones(jewels, stones)); // 输出: 3
        
        jewels = "z";
        stones = "ZZ";
        System.out.println("Number of jewels: " + numJewelsInStones(jewels, stones)); // 输出: 0
    }
}

 

代码解释
  1. HashSet的使用
    • 我们首先将 jewels 字符串转换为一个 HashSet。这样做的好处是查找操作的时间复杂度为 O(1),从而提高整体效率。
  2. 遍历 stones 字符串
    • 我们遍历 stones 字符串中的每个字符,并使用 HashSet 的 contains 方法来检查该字符是否是一个宝石。
  3. 计数
    • 如果当前字符是一个宝石,则增加计数器。
  4. 输出结果
    • 最后,我们输出宝石的总数。
结论

通过这种方法,我们可以高效地统计出 stones 中宝石的数量。这个问题不仅考察了基本的字符串操作,还展示了 HashSet 在查找操作中的高效性。希望这篇博客能帮助你理解如何使用Java来解决此类问题。

第二部分:判断一个数是否为快乐数

  在编程中,我们经常会遇到一些有趣的问题,它们挑战我们的逻辑思维和算法设计能力。今天,我们要讨论的是一个关于“快乐数”的问题。快乐数是一个正整数,它遵循一个特定的规则:将该数的每一位数字平方后相加,重复这个过程,如果最终结果为1,则这个数是快乐数;否则,如果进入无限循环且不能达到1,则不是快乐数。

这个问题看似简单,但实际上它考察的是我们对循环检测的理解以及哈希集合(HashSet)在解决此类问题中的应用。接下来,我们将用Java语言来实现这个算法,并详细解释每一步骤。

问题描述
  • 输入:一个正整数 n,满足 1 <= n <= 2^31 - 1
  • 输出:一个布尔值,如果 n 是快乐数则返回 true,否则返回 false
示例
  1. 输入n = 19
    • 输出true
    • 解释:1^2 + 9^2 = 82, 8^2 + 2^2 = 68, 6^2 + 8^2 = 100, 1^2 + 0^2 + 0^2 = 1
  2. 输入n = 2
    • 输出false
解决方案

为了解决这个问题,我们可以使用哈希集合(HashSet)来存储已经出现过的数。在每次计算平方和之后,我们检查这个结果是否已经在集合中出现过。如果出现过,说明我们进入了一个循环,且这个循环不包含1,因此 n 不是快乐数。如果结果不在集合中,我们将其添加到集合中,并继续计算下一个平方和。如果最终我们得到了1,那么 n 就是快乐数。

下面是具体的Java代码实现:

import java.util.HashSet;
import java.util.Set;

public class HappyNumber {
    public static boolean isHappy(int n) {
        Set seen = new HashSet<>();
        
        while (n != 1 && !seen.contains(n)) {
            seen.add(n);
            n = getNext(n);
        }
        
        return n == 1;
    }
    
    private static int getNext(int n) {
        int sum = 0;
        while (n > 0) {
            int digit = n % 10;
            sum += digit * digit;
            n /= 10;
        }
        return sum;
    }
    
    public static void main(String[] args) {
        int n1 = 19;
        System.out.println("Is " + n1 + " a happy number? " + isHappy(n1)); // 输出: true
        
        int n2 = 2;
        System.out.println("Is " + n2 + " a happy number? " + isHappy(n2)); // 输出: false
    }
}

 

代码解释
  1. isHappy 方法
    • 这个方法接收一个整数 n 作为参数,并返回一个布尔值表示 n 是否是快乐数。
    • 它使用一个 HashSet 来存储已经出现过的数。
    • 在一个 while 循环中,它检查 n 是否等于1或者是否已经在集合中出现过。如果等于1,则返回 true;如果已经在集合中出现过,则说明进入了循环且不会得到1,返回 false
    • 如果 n 既不等于1也不在集合中,则将其添加到集合中,并调用 getNext 方法计算下一个数。
  2. getNext 方法
    • 这个方法接收一个整数 n 作为参数,并返回它的每一位数字平方后的和。
    • 它使用一个 while 循环来遍历 n 的每一位数字,计算平方和,并将 n 除以10以移除最低位。
  3. main 方法
    • 这是程序的入口点,它测试了两个示例输入,并打印出结果。
结论

通过这种方法,我们可以高效地判断一个数是否为快乐数。这个问题不仅考察了基本的数学运算和循环检测,还展示了哈希集合在解决此类问题中的强大功能。希望这篇博客能帮助你理解如何使用Java来解决此类问题。

如果你有任何疑问或进一步的建议,请随时在评论区留言!

你可能感兴趣的:(java,python,开发语言)