算法题--华为od机试考试(字符串筛选排序、非严格递增连续数字序列、最大括号深度)

目录

字符串筛选排序

题目描述

输入描述

输出描述

示例1

输入

输入

说明

示例2

输入

输出

说明

解析

答案

非严格递增连续数字序列

题目描述

输入描述

输出描述

说明

解析

答案

最大括号深度

题目描述

输入描述

输出描述

示例1

输入

输出

说明

示例2

输入

输出

说明

示例3

输入

输出

说明

示例4

输入

输出

说明

示例5

输入

输出

说明

解析

答案


字符串筛选排序

考察排序和字符串转ASCII码值方法

题目描述

输入一个由n个大小写字母组成的字符串 按照ASCII码值从小到大进行排序规则, 查找字符串中第k个最小ASCII码值的字母(k>=1), 输出该字母所在字符串的位置索引(字符串的第一个位置索引为0)。

k如果大于字符串长度,则输出最大ASCII码值的字母所在字符串的位置索引,如果有重复字母,则输出字母的最小位置索引。

输入描述

第一行输入一个由大小写字母组成的字符串

第二行输入k,k必须大于0,k可以大于输入字符串的长度。

输出描述

输出字符串中第k个最小ASCII码值的字母所在字符串的位置索引。 k如果大于字符串长度,则输出最大ASCII码值的字母所在字符串的位置索引,如果第k个最小ASCII码值的字母存在重复,则输出该字母的最小位置索引。

示例1

输入

AbCdeFG

3

输入

5

说明

根据ASCII码值排序,第三个ASCII码值的字母为F, F在字符串中位置索引为5(0为字符串的第一个字母位置索引)

示例2

输入

fAdDAkBbBq

4

输出

6

说明

根据ASCII码值,前4个字母为AABB,由于B重复,则只取B的(第一个)最小位置索引6,而不是第二个B的位置索引8.

解析

将字符串按ASCII码值从小到大排序,找到第k大的字符,然后去原字符串中搜索第一个出现该字符的序号。

答案

function codeSort(str, k) {
    let len = str.length
    // 大于长度取最大的
    if (k > len) {
        k = len
    }
    // 根据ASCII码值从小到大排序
    let arr = str.split('').sort((a, b) => a.charCodeAt() - b.charCodeAt())
    let target = arr[k - 1]
    return str.indexOf(target)
}
console.log(codeSort('AbCdeFG', 3))
console.log(codeSort('fAdDAkBbBq', 4))

非严格递增连续数字序列

考察转换思想,简单题。

题目描述

输入一个字符串仅包含大小写字母和数字,求字符串中包含的最长的非严格递增连续数字序列长度(比如12234属于非严格递增数字序列)。

输入描述

abc2234019A334bc

输出描述

4

说明

2234为最长的非严格递增连续数字序列,所以长度为4

解析

遍历字符串,当为数字的时候判断是否为连续递增的序列,记录长度。当为字符时,序列置空。

答案

function ascendSequence(str) {
    let max = 0
    let tmp = 0
    let cur = ''
    for (let a of str) {
        if (!Number.isNaN(Number(a))) {
            if (a >= tmp) {
                tmp = a
                cur = cur + a
                if (cur.length > max) {
                    max = cur.length
                    maxStr = cur
                }
            } else {
                cur = ''
                tmp = 0
            }
        } else {
            cur = ''
            tmp = 0
        }
    }
    return max
}
console.log(ascendSequence('abc2234019A334bc'))

最大括号深度

考察栈的使用、正则表达式。

题目描述

现有一字符串仅由’(‘ ,’ )’ , ‘{‘ , ‘}’ , ‘[‘ , ‘]’六种括号组成。若字符串满足以下条件之一,则为无效字符串:

1、任一类型的左右括号数量不相等;

2、存在未按正确顺序(先左后右)闭合的括号。

输出括号的最大嵌套深度,若字符串无效则输出0.

0<=字符串长度<=100000

输入描述

一个只包( , ) , { , } , [ , ]的字符串。

输出描述

一个整数,最大括号深度

示例1

输入

[]

输出

1

说明

有效字符串,最大嵌套深度为3

示例2

输入

([]{()})

输出

3

说明

有效字符串,最大嵌套深度为3

示例3

输入

(]

输出

0

说明

无效字符串,有两种类型的左右括号数量不相等。

示例4

输入

([)]

输出

0

说明

无效字符串,存在未按正确顺序闭合的括号

示例5

输入

)(

输出

0

说明

无效字符串,存在未按正确顺序闭合的括号

解析

方法一:

利用栈先进后出的特性,当栈中无元素时只能入栈左括号,当栈中有元素时,只有左括号能入栈,为右括号时,判断与栈顶元素是否匹配,匹配则记录当前的栈长度为括号的深度。

方法二:

每一轮将对所有为{}、[]、()字符进行替换为空字符串,当无{}、[]、()字符可以替换时结束,此时字符长度为0,则返回替换的轮次为最大的括号深度。

注意最后需要判断栈中是否还有元素,如果有多的左括号,说明为无效字符。

答案

// 方法一
function maxBracket(str) {
    let len = str.length
    let arr = []
    let max = 0
    for (let i = 0; i < len; i++) {
        if (!arr[0]) {
            // 第一入栈的括号只能为左括号
            if (['(', '[', '{'].includes(str[i])) {
                arr.push(str[i])
            } else {
                return 0
            }
        } else {
            // 栈顶有元素时,只有与当前元素匹配才能出栈
            switch (str[i]) {
                case '{':
                case '[':
                case '(':
                    arr.push(str[i])
                    break;
                case ')':
                    if (arr[arr.length - 1] === '(') {
                        // 出栈前记录当前深度
                        if (max < arr.length) {
                            max = arr.length
                        }
                        arr.pop()
                    } else {
                        return 0
                    }
                    break
                case '}':
                    if (arr[arr.length - 1] === '{') {
                        // 出栈前记录当前深度
                        if (max < arr.length) {
                            max = arr.length
                        }
                        arr.pop()
                    } else {
                        return 0
                    }
                    break
                case ']':
                    if (arr[arr.length - 1] === '[') {
                        // 出栈前记录当前深度
                        if (max < arr.length) {
                            max = arr.length
                        }
                        arr.pop()
                    } else {
                        return 0
                    }
                    break
            }
        }

    }
    // 匹配完后判断是否有多的左括号
    if (arr.length !== 0) {
        return 0
    }
    return max
}

// 方法二
function maxBracket(str){
    let flag = true;
    let i = 0
    while(str.length && flag) {
      flag = false;
      if (str.includes('()')||str.includes('[]')||str.includes('{}')) {
        i++;
        flag = true;
        str = str.replace(/\(\)|\[\]|\{\}/g, '');
      }
    }
    if (str.length) {
      return 0
    } else {
      return i
    }
}
console.log(maxBracket('[]'))
console.log(maxBracket('([]{()})'))
console.log(maxBracket('(]'))
console.log(maxBracket('([)]'))
console.log(maxBracket(')('))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值