2022.8.1 华为od机试

今天进行了华为od机试,只做出来第一题,第二题感觉是对的却又不对,只过了22%,把时间全耗在第二题上了,第三题一点都没看,不过事后感觉…第三题比第二题简单的多啊,可惜了,唉。 只能说技不如人。

1.最小字符串

题目描述:
给定一个字符串s,最多只能进行一次变换,返回变换后能得到的最小字符串(按照字典序进行比较)。
变换规则:交换字符串中任意两个不同位置的字符。
输入描述:
一串小写字母组成的字符串s。
输出描述:
按照要求进行变换得到的最小字符串。
备注:
s是都是小写字符组成
1<=s.length<=1000
示例
输入:abcdef
输出:abcdef
说明:abcdef已经是最小字符串,不需要交换

输入:bcdefa
输出:acdefb
说明:a和b进行位置交换,可以得到最小字符串

只能想到暴力法,当时这题过了

const input = readline()
let minStr = ""

const check = (str1, str2)=>{
 	for(let i=0; i<str1.length; i++){
 		if(str1[i].charCodeAt()>str2[i].charCodeAt()){
 			return true
		}
		if(str1[i].charCodeAt()<str2[i].charCodeAt()){
 			return false
		}
	}
	return false
}

for(let i=0;i<input.length;i++){
	for(let j=i+1;j<input.length;j++){
		if(input[i].charCodeAt() < input[j].charCodeAt()){
			let temp = input.split('')
			temp[i] = input[j]
			temp[j] = input[i]
			if(check(input,temp)){
				minStr = temp
			}
		}
	}
} 

if(minStr === ""){
	console.log(input)
}
else{
	console.log(minStr)
}

2.水仙花拆分字符串

题目:
一.输入一组字符串, 求字符串分组后,每组的和为水仙花数
(注:水仙花数是一个三位数 其个位、十位、百位的立次方 的和等于自身 如 371 = 3^3 + 7^3 + 1^1 )
(1) 如果无法找到该分组 ,返回0 ;
(2) 找到该分组,切分组不唯一 ,返回 -1;
(3)分组唯一 ,则返回分组的组数 ;

例如:
输入: abc
输出:0
输入:f3@d5a8
输出:-1
输入:AXdddF
输出:2

这题我当时感觉自己好像是对的,但怎么都是20%不知道为啥,就卡在这一题了。于是之后百度到了一个非常巧妙的深搜解法,它用深度代表子串的个数, 真的很有道理,经测试可以。

const input = readline()

const calculate = (str) => {
	let sum = 0
	str.forEach((item) => {
		sum += item.charCodeAt()
	})
	return sum
}

const check = (str) => {
	let num = calculate(str)
	const num2 = num
	let sum = 0
	while(num !== 0){
		sum += Math.pow(num%10,3)
		num = Math.trunc(num/10)
	}
	return sum === num2 
}

const results = []

const dfs = (start, depth) => {
	if(start === input.length){
		results.push(depth)
		return
	}

	for(let end = start+1;end<=input.length;end++){
		let substr = input.substring(start, end).split('')
		if(check(substr)){
			dfs(end, depth+1)
		}
	}
}

dfs(0,0)
if(results.length === 0){
	console.log(0)
}
else if(results.length === 1){
	console.log(results[0])
}
else if(results.length > 1){
	console.log(-1)
}

3.找到它

找到它是个小游戏,你需要在一个矩阵中找到给定的单词。假设给定单词HELLOWORLD,在矩阵中只要能找到H->E->L->L->O->W->O->R->L->D连成的单词,就算通过。

注意区分英文字母大小写,并且你只能上下左右行走,不能走回头路。

输入描述:
输入第一行包含两个整数n、m(0<n,m<21)分别表示n行m列的矩阵,第二行是长度不超过100的单词W(在整个矩阵中给定单词W只会出现一次),从第3行到第n+2行是只包含大小写英文字母的长度为m的字符串矩阵。

输出描述:
如果能在矩阵中连成给定的单词,则输出给定单词首字母在矩阵中的位置(第几行 第几列),否则输出“NO”。

示例:

输入:
5 5
HELLOWORLD
CPUCY
EKLQH
CHELL
LROWO
DGRBC
输出:
3 2
1

输入:
5 5
HELLOWORLD
CPUCY
EKLQH
CHELL
LROWO
AGRBC
输出:
NO

这题感觉不难,跟走迷宫类似,但是当时时间不够了,这题一点没看。之后百度了一下没能找到完整的题目,哪位大哥要是知道完整题目请告诉我一下,非常感谢!

多谢 @Lynn Lu 大哥提供题目! 等以后有时间把答案补上

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值