华为OD机试统一考试 - 万能字符单词拼写

题目描述

有一个字符串数组 words 和一个字符串 chars。假如可以用 chars 中的字母拼写出 words 中的某个"单词"(字符串),那么我们就认为你掌握了这个单词。

words 的字符仅由 a-z 英文小写宁母组成,例如“abc”。

chars 由 a- z 英文小写字母和“?”组成,其中英文“?"表示万能字符,能够在拼写时当作任意一个英文字母。例如“?"可以当作"a"等字母。

注意: 每次拼写时,chars 中的每个字母和万能字符都只能使用一次。

输出词汇表 words 中你掌握的所有单词的个数。没有掌握任何单词,则输出0。

输入描述

第一行: 输入数组 words 的个数,记作N。

第二行~第N+1行: 依次输入数组words的每个字符串元素。

第N+2行: 输入字符串 chars

输出描述

输出一个整数,表示词汇表 words 中你掌握的单词个数

备注

1 <= words.length <= 100

1 <= words[i].length, chars.length <= 100

所有字符串中都仅包含小写英文字母、英文问号

示例1

输入
4
cat
bt
hat
tree
atach??

输出
3

说明:可以掌握的单词 "cat”、“bt"和"hat"。

示例2

输入
3
hello
world
cloud
welldonehohneyr

输出:
2

说明:可以掌握的单词 "hello”、“world"。

示例3

输入
3
apple
car
window
welldoneapplec?

输出:
2

说明:可以掌握的单词 "apple”、“car"。

代码

 //
//  test_2.swift
//  SwiftODTest
//
//  Created by jdm on 9/6/24.
//

import Foundation

func ODTest_2() {
    print("第一行: 输入数组 words 的个数,记作N")
    let wordCount = Int(readLine() ?? "") ?? 0
    print("第二行~第N+1行: 依次输入数组words的每个字符串元素")
    var words: [String] = []
    for _ in 0 ..< wordCount {
        words.append(readLine() ?? "")
    }
    print("第N+2行: 输入字符串 chars")
    let chars = readLine() ?? ""
    print("输出")
    let count = countWords(words, chars)
    print(count)
}

func countWords(_ words: [String], _ chars: String) -> Int {
    var count = 0

    for index in 0 ..< words.count {
        if canFormWord(words[index], chars) {
            count += 1
        }
    }

    return count
}

func canFormWord(_ word: String, _ chars: String) -> Bool {
    var charsCount: [Character: Int] = [:]
    // 统计 chars 中每个字符的个数
    for char in chars {
        charsCount[char] = charsCount[char] ?? 0 + 1
    }
    var wildcards = charsCount["?"] ?? 0

    // 检查 word 中每个字符是否能被 chars 中的字符拼写
    for char in word {
        if (charsCount[char] ?? 0) > 0 {
            charsCount[char] = (charsCount[char] ?? 0) - 1
        } else if wildcards > 0 {
            wildcards -= 1
        } else {
            return false
        }
    }
    return true
}

2024华为OD机试卷题 文章被收录于专栏

本专栏给大家提供了华为2024最新华为OD 题目汇总。华为OD机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。

全部评论

相关推荐

09-03 19:47
58集团_前端
#前端#&nbsp;&nbsp;&nbsp;&nbsp;22年毕业后去了北京一家创业公司,算上实习一年,在这公司呆了将近两年,裁员去了老家华为的od,在老家也算是薪资top的工作了;工作一年多,又坐不住重新找工作到北京。身边的同学大多数还在读研,而我已经具备丰富的换工作、租房等经验了。新的公司并不是bat字节一类的超级大厂,但对于我这简历已经一塌糊涂的人来说,在这冷淡的行情下,有一满意的工作已经殊为不易。有一些感受也觉得可以分享一下:1、不管是不是互联网,如果能想通,刚毕业都尽量去大厂。大厂不是唯一出路,大厂也不是所有人都能够得到的,但不可否认的是:校招是大多数人最接近大厂的时候,就好像大学老师是很多人能接触到的最牛的人一样;但凡有一丝机会都不要浪费校招,不然换工作时,不光经历不够,做的事也不是大厂想要的,面试难度可想而知。2、不要去od一类的外包。很多hr讲的天花乱坠,od和正式员工一样,同薪同酬,一视同仁,实际上可能吗?你是半路上打折买来的马楼,人家是精挑细选来的正编打工人,会给你喂一样的伙食?玩游戏都知道嘴上说着广智救我,但你什么时候给广智加点过?不说在公司里受多大委屈(这里我觉得做过的都懂),只看在找下一份工作的时候,hr看到你曾经是别人打折买的马楼,真的很难给你一个平等的对待,再加上od的薪资结构在以后谈薪时的种种劣势,想跳都难。3、工作不要换太频繁很多人都知道互联网涨薪靠跳槽,不可否认,但在目前薪资属于正常范围内时,最好不要为了涨薪而频繁跳槽;原公司的核心业务和技术有没有拿下,就hr看到你简历每段都是3年时,都可以预料到3年后你又会从这里跳走。不过我总共也没工作几年,这点就当是提一句最后分享一下我目前工作的入职经历:一面是我现在的组长直接面的,整整两个小时不带一点儿八股文,据说因为之前面试有人疑似用ai作弊;所以题都是自己编的,也不是leetcode那种算法题;入职后发现都是他们工作中踩过的坑和难点,当时我面麻了。二面就是老板面了,畅聊+谈论规划,因为我有丰富的面试经验,所以毫无疑问。三面是一轮技术面用来定级,当时已经可以看出结果了,应该是十拿九稳。最后hr面时我在海南旅游,也是没什么问题,主要担忧是看我工作换的太频繁,我说我都这么频繁了,现在真的不敢浪了。。。hr面到定薪花了挺久,我觉得和我od的base低有关,很难达成一致。最后因为种种原因导致我实在不想面试了,就要了。
投递字节跳动等公司10个岗位
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务