华为笔试题

今晚刚笔试完,关于其中第三题,个人认为应该使用正则表达式解决,当然我做题老是超级费时间,所以当时没做出来,一直出错,现在自己找出了错误,将通过的代码记录一下,另外警醒自己写代码少犯错。关于match函数的用法也不熟练,输出结果是所有匹配项,这个一开始就错了。

题目具体说不全面了,说大致要求:
* +代表加法、*代表乘法、^代表自增;
* 要求括号匹配;运算符和数字之间以空格隔开;数字与数字之间用空格隔开;
* 在前面括号格式正确的情况下,后面又有独立的正确的括号,则输出最后的而结果;
* 格式不正确输出-1。
计算字符树的结果:
例如:(+ (+ 2 3)(^ 4)) 输出 10; (+ 2 3 ) 输出-1;

function compute(str){
    let temp1 = "\\(\\^\\s(\\d)+\\)";
    let temp2 = "\\([*|+]\\s(\\d)+(\\s(\\d)+)+\\)";
    let reg1 = new RegExp(temp1,"g");
    let reg2 = new RegExp(temp2,"g");

    let y = str.match(reg1);
    let z = str.match(reg2);

    while(y !== null || z !== null) {
      if(y){
        for(let k0=0; k0<y.length; k0++){
            let number0 = y[k0].match(/(\d)+/g);
            let num = (+number0[0]);
            num++;
            let index0 = str.indexOf(y[k0]);
            if(str[index0-1] == " "){
                str = str.replace(y[k0],num);
            }else{
                str = str.replace(y[k0]," "+num);
            }

        }
      }
        //console.log(z[0]);
      if(z){
        for(let k1=0; k1<z.length; k1++){
            let len = z[k1].length;
            let flag = z[k1][1], sum;
            if (flag == "+") {
                let i = 0;
                sum = 0;
                let number1 = z[k1].match(/(\d)+/g);
                //console.log(number[2]);
                while (number1[i]) {
                    sum += (+number1[i]);
                    i += 1;

                }
            } else if (flag == "*") {
                let j = 0;
                sum = 1;
                let number2 = z[k1].match(/(\d)+/g);
                //console.log(number2);
                while (number2[j]) {
                    sum *= (+number2[j]);
                    j++;
                    //console.log(sum);
                }
            }
            //console.log(sum);
            let index1 = str.indexOf(z[k1]);
            if(str[index1-1] == " "){
                str = str.replace(z[k1],sum);
            }else{
                str = str.replace(z[k1]," "+sum);
            }
        }
      }
        y = str.match(reg1);
        z = str.match(reg2);
    }
    if(str.match(/^(\s(\d)+)+$/g)){
        let y = str.match(/(\d)+$/g)
        return y[0];
    }
    return -1;
}
console.log(compute("(+ 2 (+ 1 2))"));   //5
console.log(compute("(^ (+ (+ 2 3 4)(* 1 2)))"));  //12
console.log(compute("(^ (+ (* 2 3)(+ 1 2)))(+ 2 3)(^ 6)")); //7
### 华为笔试题 IT 类型 题库 开发 运维 算法 数据结构 华为作为全球领先的科技公司之一,在其招聘过程中非常注重考察候选人的技术能力,尤其是开发、运维以及算法和数据结构方面的知识。以下是关于这些主题的一些常见考点及相关内容。 #### 常见的算法和数据结构 对于开发者来说,“算法和数据结构”是面试中的核心部分。以下是一些常见的算法和数据结构及其应用: - **数组与字符串操作** 数组和字符串是最基础的数据结构,常用于解决实际问题。例如,反转字符串或查找子串等问题经常出现在考试中[^1]。 - **链表** 链表的操作包括增删节点、翻转链表等。这类题目通常用来测试候选人对指针的理解程度。 - **栈与队列** 栈和队列的应用场景广泛,比如括号匹配问题可以通过栈来实现;广度优先搜索(BFS)则依赖于队列[^2]。 - **树与图** 树形结构如二叉树遍历(前序、中序、后序)、最小生成树等都是高频考点。而图论涉及最短路径(Dijkstra算法)、拓扑排序等内容也非常重要。 - **动态规划** 动态规划是一种优化方法,适用于求解多阶段决策过程的最佳策略问题。它通过记录中间状态减少重复计算量从而提高效率[^3]。 #### 华为OD机试试题实例分析 以具体案例说明如何运用上述理论解决问题。例如,在任务最优调度这一类问题上,可以采用深度优先搜索(DFS)或者回溯法找到所有可能组合并从中挑选最佳方案。 另外还有其他类型的编程挑战,像给定一组数找出其中的最大连续子序列之和等等。这些问题不仅考验基本功扎实与否同时也考量思维灵活性。 #### 运维方向的知识要点 除了纯编码技能外,针对运维岗位还会有专门面向系统管理和网络配置等方面的技术问答。例如了解哪些工具能够对接主流虚拟化平台进行统一纳管就是其中一个例子[A.eSight](https://support.huawei.com/enterprise/docinforeader.do?lang=en&docid=EDOC1100089475)[^4]。 ```python def max_subarray_sum(nums): """ 计算最大连续子数组的总和 参数: nums (List[int]): 输入整数列表 返回值: int: 最大子数组的和 """ current_max = global_max = nums[0] for num in nums[1:]: current_max = max(num, current_max + num) if current_max > global_max: global_max = current_max return global_max ``` 以上代码片段展示了利用Kadane's Algorithm快速定位到目标区间内的最高数值累积效果的方法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值