华为 5月20日 笔试 试题及详细解答

本文分享了华为5月20日笔试的三道编程题,包括链表根据名字分组、有向图寻找环路和街区监控问题的解法。强调了正则表达式在解决链表分组问题中的高效性,并指出华为笔试中字符串处理的重要性。同时,对于街区监控问题,提出了两种不同的解题思路。

华为,520,但我不配拥有offer

昨晚做了华为笔试,一道题都没做出来,我不配拥有offer。

下面的代码都是我下来之后写的,注释也很详细,希望能给大家带来一些帮助。

这些代码都是能够运行的,并且我想到的情况都能通过,但是由于无法提交验证,不排除仍有错漏的情形。如果你发现本文中有漏洞,不妨在评论区指出来吧。

第一题 [编程|100分] 链表分组

题目描述
Node有2个属性{id:Int, name:string},
输入一个Node链表collection,及分组标识splitter:string,将Node.name==splitter作为分组条件,对传入的Node链表进行分组。
输入描述:
第一行是分组条件,是一个字符串
第二行开始,每行是一个Node实例{id:Int, name:string},Ex:1,name1
输出描述:
第一行输出分组总数
第二行开始,每行输出分组后的Node,每行一个分组,Node实例间使用|做为分隔符,输出顺序与输入顺序保持一致
示例1输入输出示例仅供调试,后台判题数据一般不包含示例
输入

*
1,name1
2,name2
3,*
4,name4
5,name5

输出

2
1,name1|2,name2
4,name4|5,name5

备注:
输入不满足要求,输出为0

第一题 解答

这道题本身不算难,但是循环输入可能难倒了一批人,比如我。

平常碰到的循环输入大多是一行一个用例,不需要结束,这种情况的处理我以前写过。
编程题 多用例 循环输入 C++/Java/Python/Golang

但这道题的输入很特殊,这道题只有一个用例,空行结束。
那篇文章里的C++代码就不行了,这里写个C++的循环输入给大家参考一下。

#include <iostream>

using namespace std;

int main()
{
   
   
    //循环输入,空行结束
    char s[1024];
    while(gets(s))
    {
   
   
        if(s[0]=='\0')break;
        //转string方便处理
        string ss=s;
        cout<<ss<<endl;
    }
    cout<<"end"<<endl;
    return 0;
}

吐槽一下,CSDN这个斜体注释是真的难看。

好了,下面进入正题。
我最开始写的是常规解法,但是这道题使用正则表达式会简便很多。因为输出和输入其实是完全一样的结构,所以我们不需要真的去将字符串解析为实例,只需要判断这个字符串是否匹配就够了。
我两种解法都写了,常规解法磨叽且可读性较低,建议直接阅读正则表达式解法。
另外多说一句,华为特别爱考字符串处理,如果你想考好华为笔试,建议你着重复习/预习一下正则表达式。

常规解法

package main

import "fmt"

type node struct {
   
   
	id int
	name string
	next *node
}

func main() {
   
   
	var id int
	var pt,name string
	fmt.Scan(&pt)
	head:=&node{
   
   }
	pre:=head
	cnt:=0
	flag:=false
	nodeCnt:=0
	for {
   
   
		n, err := fmt.Scanln(&id, &name)
		//空行或输入不合法
		if n < 2 {
   
   
			break
		}
		if err != nil {
   
   
			fmt.Println(0)
			return
		}
		//这里的name包含“,”
		if len(name)==1 && name[0]!=','{
   
   
			fmt.Println(0)
			break
		}
		name=name[1:]
		node := node{
   
   id: id, name: name}
		pre.next = &node
		pre = &node
		nodeCnt++
		if name != pt {
   
   
			if !flag{
   
   
				cnt++
			}
			flag = true
		} else {
   
   
			flag = false
		}
	}
	fmt.Println(cnt)
	cur:=head.next
	newLine:=
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值