今天进行了华为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 大哥提供题目! 等以后有时间把答案补上