华为OD机试(41-60)老题库解析Java源码系列连载ing

news2024/10/5 16:25:58

华为OD机试算法题新老题库练习及源码

    • 41.寻找相同子串
    • 42.找出经过特定点的路径长度
    • 43.全量和已占用字符集
    • 44.密钥格式化
    • 45.数字字符串组合倒序



郑重声明: 1.博客中涉及题目为网上搜索而来,若侵权,请联系作者删除。 源码内容为个人原创,仅允许个人学习使用。
2.博客中涉及的源码非官方答案,不保证正确性。
3.切勿将博客内容用于官方考试,若应用于官方考试,后果自行承担,与原作者无关。
4.原作者保留知识版权,且有权向侵权者追究刑事责任

41.寻找相同子串

题目描述

给定一个字符串s,最多只能进行一次变换,返回变换后能得到的最小字符串(按照字典序进行比较)。
变换规则:交换字符串中任意两个不同位置的字符。

输入描述

一串小写字母组成的字符串s

输出描述

按照要求进行变换得到的最小字符串。

  • s是都是小写字符组成
  • 1 ≤ s.length ≤ 1000
输入abcdef
输出abcdef
说明abcdef已经是最小字符串,不需要交换。
输入bcdefa
输出acdefb
说明a和b进行位置交换,可以得到最小字符串

源码和解析
解析:

先排序,找出排序后顺序交换位置距离最远的那个进行交换即可

示例代码:

import java.util.Arrays;
import java.util.Scanner;

/**
 * 一次变换要想得到最小 那么交换时,肯定是将最小的字符往前提 如果那个最小字符有多个,则肯定是提取最后一个
 * 比如 bacada===> aacadb=> 最后一个a和首字符交换 
 *  解决思路 先排序 查找从前往后字符串变化的地方
 */
public class T41 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String rawWord=sc.nextLine();
		char[] cArr=rawWord.toCharArray();
		Arrays.sort(cArr);
		boolean flag=false;
		for(int i=0;i<cArr.length;i++) {
			if(cArr[i]!=rawWord.charAt(i)) {
				char obj=cArr[i];//要替换的目标字符
				int lastIndex=rawWord.lastIndexOf(obj); //要替换的目标字符 最后的索引
				StringBuilder sb=new StringBuilder(rawWord);
				char rawObj=sb.charAt(i);//目标字符提前的索引对应字符 目标字符要和谁换
				sb.setCharAt(i, obj);
				sb.setCharAt(lastIndex, rawObj);
				System.out.println(sb.toString());
				flag=true;
				break; 
			}
		}
		if(flag==false){
			System.out.println(rawWord);
		}
	}
}

代码运行示意图:
在这里插入图片描述
在这里插入图片描述

42.找出经过特定点的路径长度

题目描述

输入描述

输入一个字符串,都是以大写字母组成,每个相邻的距离是 1,
第二行输入一个字符串,表示必过的点。
说明每个点可过多次。

输出描述

经过这些必过点的最小距离是多少

用例

输入

ANTSEDXQOKPUVGIFWHJLYMCRZB
ABC

输出28
说明

源码和解析
解析:

这个题重在理解,可以使用动态规划DP算法进行求解。
在用例
ANTSEDXQOKPUVGIFWHJLYMCRZB
ABC
中 A->0 B-25 C-22 那么从起点字符串开始的起点A -> 目标点A距离为0 A到B距离为25-0=25 B-C= |25-22|=3 那么ABC的最小距离为28
倘若字符串中包含多个A或者多个B的情况
那么{A:[ 1,3,5…],B:[4,6,8],C:[12,13]}
==》ABC 为三个列表的有序组合 [1,4,12] 距离为 (1-0)+(4-1)+(12-4)
==》ABBC 则为四个列表的有序组合

因此可以使用动态规划算法进行求解,不懂的可以到我的个人主页去算法专栏查找。
示例代码:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class T42 {
	static int num[] = null;// 记录 每次dfs产生的 临时数据
	static String objInput = "";
	static int min = -1;// 最小路径距离
	static Map<Character, List<Integer>> map = null;

	public static void main(String[] args) {
		String input = "ANTBSEDXQOKPUAVGIFWHJLYMCRZB";
		objInput = "ABCB";
		map = new HashMap<Character, List<Integer>>();
		for (int i = 0; i < objInput.length(); i++) {
			if (!map.containsKey(objInput.charAt(i))) {
				map.put(objInput.charAt(i), new ArrayList<Integer>());
			}
			for (int j = 0; j < input.length(); j++) {
				if (input.charAt(j) == objInput.charAt(i)) {
					if (map.get(input.charAt(j)).contains(j))
						continue;
					map.get(input.charAt(j)).add(j);
				}
			}
		}
		System.out.println(map);
		num = new int[objInput.length()];
		dfs(0);
		System.out.println(min);
	}

	/**
	 * 
	 * @param p
	 *            位置序号 从0开始 通过该序号 可以取到键及其对应的列表
	 */
	public static void dfs(int p) {
		if (p >= objInput.length()) {
			int tempDistance = num[0];//
			// System.out.print(num[0]+" ");
			for (int i = 1; i < num.length; i++) {
				tempDistance += Math.abs(num[i] - num[i - 1]);
				// System.out.print(num[i]+" ");
			}
			// System.out.println();
			if (min == -1) {
				min = tempDistance;
			}
			if (tempDistance < min) {
				min = tempDistance;
			}
			return;
		}
		for (int i = 0; p < num.length
				&& i < map.get(objInput.charAt(p)).size(); i++) {
			num[p] = map.get(objInput.charAt(p)).get(i);
			dfs(p + 1);
		}

	}

}

代码运行示意图:
在这里插入图片描述

43.全量和已占用字符集

题目描述

给定两个字符集合,一个是全量字符集,一个是已占用字符集,已占用字符集中的字符不能再使用。

输入描述

  1. 输入一个字符串 一定包含@,@前为全量字符集 @后的为已占用字符集
  2. 已占用字符集中的字符一定是全量字符集中的字符
  3. 字符集中的字符跟字符之间使用英文逗号隔开
  4. 每个字符都表示为字符+数字的形式用英文冒号分隔,比如a:1标识一个a字符
  5. 字符只考虑英文字母,区分大小写
  6. 数字只考虑正整型 不超过100
  7. 如果一个字符都没被占用 @标识仍存在,例如 a:3,b:5,c:2@

输出描述

  • 输出可用字符集
  • 不同的输出字符集之间用回车换行
  • 注意 输出的字符顺序要跟输入的一致,如下面用例不能输出b:3,a:2,c:2
  • 如果某个字符已全部占用 则不需要再输出

用例

输入a:3,b:5,c:2@a:1,b:2
输出a:2,b:3,c:2
说明
  • 全量字符集为三个a,5个b,2个c
  • 已占用字符集为1个a,2个b
  • 由于已占用字符不能再使用
  • 因此剩余可用字符为2个a,3个b,2个c
  • 因此输出a:2,b:3,c:2

源码和解析
解析:

题目过于简单,考查基础知识。字符串操作,Map集合的使用

示例代码:

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class T43 {
	public static void main(String[] args) {
		String input = "a:3,b:5,c:2,d:10@a:1,b:2,d:3";
		String allKeyValue[] = input.split("@")[0].split(",");
		String usedKeyValue[] = input.split("@")[1].split(",");
		Map<String, Integer> map = new HashMap<String, Integer>();
		String lastKey = "";
		for (String keyValue : allKeyValue) {
			String key = keyValue.split(":")[0];
			int value = Integer.parseInt(keyValue.split(":")[1]);
			map.put(key, value);
			lastKey = key;
		}
		for (String keyValue : usedKeyValue) {
			String key = keyValue.split(":")[0];
			int value = Integer.parseInt(keyValue.split(":")[1]);
			map.put(key, map.get(key) - value);
		}
		for (Entry<String, Integer> entry : map.entrySet()) {
			System.out.print(entry.getKey() + ":" + entry.getValue());
			if (!entry.getKey().equals(lastKey)) {
				System.out.print(",");
			}
		}
	}
}

代码运行示意图:
在这里插入图片描述

44.密钥格式化

题目描述

给定一个非空字符串 S,其被 N 个’-‘分隔成 N+1 的子串,给定正整数 K,要求除第一个子串外,其余的串每 K 个用’-‘分隔,并将小写字母转换为大写。

输入描述

正整数 K 和‘-’分割的字符串,如:
2
25G3C-abc-d

输出描述

转换后的字符串

用例

输入

4
5F3Z-2e-9-w

输出5F3Z-2E9W
说明

字符串 S 被分成了两个部分,每部分 4 个字符;

注意,两个额外的破折号需要删掉。

输入

2
2-5g-3-J

输出2-5G-3J
说明字符串 S 被分成了 3 个部分,按照前面的规则描述,第一部分的字符可以少于给定的数量,其余部分皆为 2 个字符。

源码和解析
解析:

重在考查字符串操作基础知识

示例代码:

import java.util.Scanner;

public class T44 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int num = Integer.parseInt(scanner.nextLine());
		String input = scanner.nextLine();
		String[] wordArr = input.split("-");
		StringBuilder sb = new StringBuilder();
		for (int i = 1; i < wordArr.length; i++) {
			sb.append(wordArr[i].toUpperCase());
		}
		System.out.print(wordArr[0]);
		for (int i = 0; i < sb.length(); i++) {
			if (i % num == 0)
				System.out.print("-");
			System.out.print(sb.charAt(i));
		}
	}
}

代码运行示意图:
在这里插入图片描述
在这里插入图片描述

45.数字字符串组合倒序

题目描述

对数字,字符,数字串,字符串,以及数字与字符串组合进行倒序排列。
字符范围:由 a 到 z, A 到 Z,
数字范围:由 0 到 9
符号的定义:

  • “-”作为连接符使用时作为字符串的一部分,例如“20-years”作为一个整体字符串呈现;
  • 连续出现 2 个 “-” 及以上时视为字符串间隔符,如“out--standing”中的”–“视为间隔符,是 2 个独立整体字符串”out”和”standing”;
  • 除了 1,2 里面定义的字符以外其他的所有字符,都是非法字符,作为字符串的间隔符处理,倒序后间隔符作为空格处理;
  • 要求倒排后的单词间隔符以一个空格表示;如果有多个间隔符时,倒排转换后也只允许出现一个字格间隔符;

输入描述

输出描述

用例

输入I am an 20-years out--standing @ * -stu- dent
输出dent stu standing out 20-years an am I
说明

源码和解析
解析:

正则匹配 字符串替换 字符串拆分

示例代码:

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

public class T45 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String input = sc.nextLine();
		// I am an 20-years out--standing @ * -stu-dent
		String str1 = "[^0-9a-zA-Z-]";// 非法字符 //空格 @ *
		String[] items1 = input.split(str1);
		List<String> wordList = new ArrayList<String>();
		for (String w : items1) {
			if (w.replaceAll(" ", "").length() == 0) {
				continue;
			}
			if (w.indexOf("--") != -1) {
				w = w.replaceAll("--", "&");// 后面用&符号统一分割一次
			}
			if (w.indexOf("-") != -1) {
				// 解决头尾出现的问题 即可
				if (w.charAt(0) == '-' || w.endsWith("-")) {
					w = w.replaceAll("-", "&").replace(" ", "");
				}
			}
			for (String item : w.split("&")) {
				if (item.replaceAll(" ", "").length() == 0) {
					continue;
				}
				wordList.add(item);
			}
		}
		for (int i = wordList.size() - 1; i >= 0; i--) {
			System.out.print(wordList.get(i) + " ");
		}
	}
}

代码运行示意图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/598810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git --- git merge用法

1 git merge介绍 在Git中,合并是一个连接分叉历史的过程。它将两个或多个开发历史连接在一起。git merge命令可以帮助你把git分支创建的数据整合到一个分支中。git merge会将一系列的提交关联到一个统一的历史。 在上图中,有两个分支 master 和 feature。我们可以看到,我们…

《priority_queue》

本文主要介绍优先级队列的使用&#xff0c;以及一个TOPK问题的OJ 文章目录 一、priority_queue的介绍二、priority_queue的使用三、[数组中第k个大的元素](https://leetcode.cn/problems/kth-largest-element-in-an-array/) 一、priority_queue的介绍 优先队列是一种容器适配器…

代码创造童话--Python为六一儿童节送专属礼物

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 六一儿童节到啦&#xff0c;祝所有的朋友们六一儿童节快乐&#xff01; 在这个节日里&#xff0c;孩子们可以接受父母、老师、社会各界人士的关爱和祝福&#xff0c;同时也可以享受到各种各样的礼物和活动。Python作为一门…

第十五篇、基于Arduino uno,获取mpu6050三轴加速度、角速度、温度的数据——结果导向

0、结果 说明&#xff1a;先来看看串口调试助手显示的结果&#xff0c;第一个值是温度值&#xff0c;第二个值是X轴的加速度&#xff0c;第三个值是Y轴的加速度&#xff0c;第四个值是Z轴的加速度&#xff0c;第五个值是X轴的角速度&#xff0c;第六个值是Y轴的角速度&#xff…

C++库函数——string类

1. 简介 ①什么是string类 源文档 译&#xff1a; 1. 字符串是表示字符序列的类 2. 标准的字符串类提供了对此类对象的支持&#xff0c;其接口类似于标准字符容器的接口&#xff0c;但添加了专门用于操作单字节字符字符串的设计特性。 3. string 类是使用 char( 即作为它…

【六一】90后的你们还记得年少时的梦吗?还记得你们当初追的奥特曼吗?现在就让我们一起回味我们逝去的曾经吧!

迎面走来的是我们从未正式出过剧集&#xff0c;并附有“反派”盛名的大哥&#xff01;佐~~菲~~&#xff01; 还记得第一个登场&#xff0c;第一个进入我们的视野的那位吗&#xff1f;没错&#xff0c;那就是奥特曼 我的最爱~~~~~赛文&#xff01; 一度以为&#xff0c;曾经的那…

Bellhop 绘制传播损失

文章目录 前言一、相干传播损失&#xff08;TL&#xff09;基本算例1、环境文件2、绘制相干传播损失 二、相干、半相干和非相干传播损失&#xff08;TL&#xff09; 前言 上文我们讲述了 Bellhop 的使用以及使用 bellhop 绘制了声速剖面、声线轨迹及本证声线&#xff0c;本文我…

【SpringMVC】入门案例

前言: SpringMVC是隶属于Spring框架的一部分&#xff0c;主要是用来进行Web开发&#xff0c;是对Servlet进行了封装。 对于SpringMVC我们主要学习如下内容: SpringMVC简介请求与响应REST风格SSM整合(注解版)拦截器 SpringMVC是处于Web层的框架&#xff0c;所以其主要的作用…

用户验证FTP实验

用户FTP实验 目录 匿名用户验证&#xff1a; 本地用户验证&#xff1a; 本地用户访问控制&#xff1a; 匿名用户验证&#xff1a; 例&#xff1a;&#xff08;前提配置&#xff0c;防火墙关闭&#xff0c;yum安装&#xff0c;同模式vmware11&#xff09; 现有一台计算机huy…

数据结构算法-图技术点(图的算法实现)

先看 定义邻接表 //边 struct Edge {int AdjVertex;//邻接顶点int Weight;//权值Edge* next;//下一条边 };using VertexValue use define//顶点 struct Vertex {VertexValue value; // 顶点数据Edge* First;//获取第一条边 }; //邻接顶点 using AdjVertex Vertex*; //邻接…

自动驾驶嵌入式开发工程师:车载SOC开发修炼秘籍

声明&#xff1a;本文档是博主在开发学习过程中写的笔记&#xff0c;本意是便于以后开发复盘&#xff0c;参考《 ug1144-petalinux-tools-reference-guide》、《ug1085》、黑金Zynq UltraScale MPSoC 5EV开发板资料、英伟达官方资料。大佬勿喷 大佬勿喷 大佬勿喷&#xff01;&a…

【资料分享】RS-485 串行接口说明

面对大量可用的串行接口&#xff0c;可能很难理解它们之间的差异以及何时使用它们。正如我最喜欢的工程学教授经常说的那样&#xff0c;“标准的美妙之处在于有很多标准可供选择。” 今天的编码器比以往任何时候都更智能、更先进&#xff0c;要求工程师放弃更简单的正交增量传感…

智能网联环境下数据安全分析与建设思考

01安全概况 随着智能化程度不断提升&#xff0c;汽车正逐渐从传统意义上的交通工具演化为公路上的智能终端&#xff0c;核心部件也从发动机、变速箱、底盘上升为芯片、软件与数据。相关机构研究表明&#xff0c;目前全球市场搭载智能网联功能的新车渗透率约为45%&#xff0c;预…

160个CrackMe之001

吾爱中的逆向练习题 运行程序 有两个方式 一个是账号登入 一个是序列号输入 账号输入 方法一 爆破 我们先进行账号输入 这个是最简单的逆向 所以我们可以使用 字符串查找看看 先试用ollydbg打开 右键 ->查找 ->所有参考文本字符串 这里我们能发现有两个报错 我们还…

《C++ deque的介绍以及stackh和queue的模拟实现》

文章目录 一、容器适配器1.1 什么是适配器1.2 STL中stack和queue的底层结构1.3 deque的简单介绍1.3.1 deque的原理介绍1.3.2 deque的结构1.3.3 deque和vector以及list的对比1.3.4 为什么选择deque作为stack和queue的适配容器 二、stack的模拟实现三、queue的模拟实现 一、容器适…

5个超实用视频素材网站,免费下载~

推荐几个高清无水印的视频素材网站&#xff0c;重点是可以免费下载使用&#xff0c;建议收藏&#xff01; 菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 可以称之为最大素材库&#xff0c;在这里你可以找到设计、办公、图片、视频、音频等各种素材。视频素材就有…

基于Nginx搭建LNMP

目录 一&#xff1a;安装 Nginx 服务 1、关闭防火墙、安装依赖包 2、创建运行用户 3、压缩包编译安装 4、优化路径 5、添加 Nginx 系统服务 二&#xff1a; 安装 MySQL 服务 1、安装Mysql环境依赖包 2、创建运行用户 3、编译安装 4、修改mysql 配置文件 5、更改mysql安装…

网络通信:http协议

虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议) 就是其中之一. 认识URL 统一资源定位符(Uniform Resource Locator&#xff0c;缩写&#xff1a;URL)&#xff0c;…

springboot + vue3实现视频播放Demo(video.js Vue3-video-play视频播放器)

文章目录 学习链接前言ffmpeg安装ffmpeg配置环境变量分割视频文件 后台配置WebConfig 前端代码video.js示例安装依赖视频播放组件效果 Vue3-video-play示例安装依赖main.js中使用视频播放组件效果 学习链接 ffmpeg官网 长时长视频java存储及vue播放解决方法 【 攻城略地 】vue…

AKStream部署1:ZLMediaKit流媒体服务器(win)

环境准备&#xff1a; windows10/11 visual stadio 2022(.net 6) cmake 3.22.0 git bash 没讲究直接下最新的 ffmpeg &#xff1a; ffmpeg-5.1.2-full_build VLC播放器&#xff1a;VLC media player ZLMediaKit&#xff1a;gitee地址 1、安装上述软件 例ffmpeg下载解压至某自定…