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

华为,520,但我不配拥有offer昨晚做了华为笔试,一道题都没做出来,我不配拥有offer。下面的代码都是我下来之后写的,注释也很详细,希望能给大家带来一些帮助。这些代码都是能够运行的,并且我想到的情况都能通过,但是由于无法提交验证,不排除仍有错漏的情形。如果你发现本文中有漏洞,不妨在评论区指出来吧。第一题 [编程|100分] 链表分组题目描述Node有2个属性{id:Int, name:string},输入一个Node链表collection,及分组标识splitter:string,将N
摘要由CSDN通过智能技术生成

华为,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
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值