华为,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