华为OD E卷(100分)13-猜字谜

前言

        工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。

题目描述

        小王设计了一个简单的猜字谜游戏,游戏的谜面是一个或多个错误的单词(如"nesw"),玩家需要猜出谜底库中正确的单词。

        猜中的要求如下:

  1. 变换顺序:谜面和谜底单词变换顺序后相同,例如"nwes"和"news"。
  2. 字母去重:谜面和谜底单词去重后的字母序列相同,例如"woo od"和"wo od",去重后都是"w od"。

        玩家需要在谜底库中找到所有满足上述任一条件的单词,并返回结果列表。如果找不到对应的谜底,则返回"not found"或类似信息。

输入 

        谜面单词列表,以","分隔。
        谜底库单词列表,以","分隔。

输出 

        匹配到的正确单词列表,以","分隔。
        如果找不到对应谜底,返回"not found"。

示例

输入:

conection,today  // 谜面
connection,wrong,today // 谜底库

输出:
connection,today

解题思路

  1. 判断包含字符是否相等
  2. 判断是否去重后字母相同

题解

java实现

package huawei.e100;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.TreeSet;

/**
* @author arnold
* @date 2024年12月10日
* 
*/
public class T13 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			List<String> res = new ArrayList<>();
			String[] guessWords = sc.nextLine().split(",");
			String[] baseWords = sc.nextLine().split(",");
			
			for (String s : guessWords) {
				res.add(guess(s, baseWords));
			}
			System.out.println(String.join(",", res));
		}
	}
	
	private static String guess(String guessWord, String[] baseWords) {
		String res = "not found";
		for (String b : baseWords) {
			if (check1(guessWord,b) || check2(guessWord,b)) {
				return b;
			}
		}
		return res;
	}
	
	// 判断包含字符是否相等
	private static boolean check1(String guessWord, String baseWord) {
		if (guessWord.length() != baseWord.length()) return false;
		char[] c1 = guessWord.toCharArray();
		Arrays.sort(c1);
		char[] c2 = baseWord.toCharArray();
		Arrays.sort(c2);
		if (Arrays.equals(c1, c2)) {
			return true;
		}
		return false;
	}
	// 判断是否去重后字母相同
	private static boolean check2(String guessWord, String baseWord) {
		TreeSet<Character> t1 = new TreeSet<Character>();
		TreeSet<Character> t2 = new TreeSet<Character>();
		for (char c: guessWord.trim().toCharArray()) {
			t1.add(c);
		}
		for (char c: baseWord.trim().toCharArray()) {
			t2.add(c);
		}
		if(t1.equals(t2)) {
			return true;
		}
		return false;
	}
	

}
内容概要:本文系统探讨了CUDA并行计算优化技巧在计算机竞赛中的实战应用,重点解决暴力枚举在大规模数据下超时的问题。通过将独立的解空间验证任务配给GPU海量线程并发执行,显著提升计算效率。文章围绕图论(全源最短路径Floyd-Warshall算法)和数值计算(多初始值牛顿迭代求解非线性方程)两大高频竞赛场景,详细剖析了线程索引映射、原子操作、常量内存、流并发等核心优化技术,并提供了串行与并行代码对比及性能析。结果显示,在A100和RTX 3090等GPU上,加速比可达72至150倍,实现从钟级到秒级甚至毫秒级的性能突破。此外,文章展望了动态并行、多GPU协同、AI辅助调优等未来趋势,强调CUDA优化对培养软硬件协同思维的重要意义。; 适合人群:具备一定C/C++编程基础和算法竞赛经验,熟悉基本图论与数值计算问题,希望提升高性能计算能力的高校学生或竞赛选手(尤其是参与ACM、ICPC、NOI等赛事的1-3年备赛者); 使用场景及目标:①掌握如何将传统暴力枚举算法转化为GPU并行版本;②深入理解Floyd-Warshall和牛顿迭代等经典算法的并行化限制与优化策略;③学习CUDA内存模型、线程组织与同步机制在实际问题中的应用; 阅读建议:建议结合文中代码案例在支持CUDA的环境上动手实现并调试,重点关注线程映射、内存访问模式与数据依赖处理,同时对比串行与并行版本的运行效率,深化对并行计算本质的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

arnold66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值