宝石与石头

140 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

  •  给你一个字符串 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 中的所有字符都是 唯一的

二、思路分析:

  • 一个不同的字母代表一种宝石,石头中包含宝石,其实意思就是一个字符串中的单个字符在另一个字符串出现的次数和
  • 两种方式,需要双重遍历
    • 第一种:字符串方法
      • 首先,定义一个保存宝石的数组变量
      • 遍历宝石和石头字符串,利用字符串的charAt方法,每次取出一个字符比较
      • 如果从宝石取出的字符串等于冲石头取出字符串,就说明这个当前的从石头取出的字符串是宝石
      • 将该字符串添加到定义好的变量中,返回该数组的长度,即宝石个数
    • 第二种:数组方法
      • 要利用数组方法,首先需要将字符串转化成数组
      • 然后双重遍历,依次取出,如果从宝石取出的字符串等于冲石头取出字符串,就说明这个当前的从石头取出的字符串是宝石
      • 将该字符串从石头数组中截取出来,添加到结果数组中
      • 数组方法splcie用作截取时改变原数组的长度,所以截取之后,循环参数需要减去1

三、AC 代码:

  • 第一种:字符串方法
function numJewelsInStones(jewels: string, stones: string): number {
    let result: Array<string> = [];
    for(let i = 0; i < jewels.length; i++){
        for(let j = 0; j < stones.length; j++){
            if(jewels.charAt(i) === stones.charAt(j)){
                result.push(stones.charAt(j))
            }
        }
    }
    return result.length
};
  • 第二种:数组方法
function numJewelsInStones(jewels: string, stones: string): number {
    let result: Array<string> = [];
    let jewelsArr = jewels.split('');
    let stonesArr = stones.split('');
    for(let i = 0; i < jewelsArr.length; i++){
        for(let j = 0; j < stonesArr.length; j++){
            if(jewelsArr[i] === stonesArr[j]){
                result.push(stonesArr.splice(j, 1)[0]);
                j--
            }
        }
    }
    return result.length
};

四、总结:

  • 题目难度简单,双重循环暴力解法
  • 需要注意字符串charAt方法不改变字符串长度,数组splice方法用作截取时改变原数组长度,截取之后需要将循环参数减去1,因为数组长度-1,循环需要重新修正位置
  • 更多解题方式,移步题解区

image.png