华为od一面面试算法

华为od一面面试算法


在看题目之前,谈谈对于面试时手撸算法的看法,如果在面试之前刷了几百+的leetcode,那么只要好好总结一下,我觉得面试的算法是完全可以做出来的;但是如果没有刷到那么多,我们怎么能够发挥好?我觉得首先对于每种类型的题目,例如链表类的、数组类的、二叉树类的、排序类的、字符串类的、双指针、这些每种类型的题目刷几道,对于解题思路就能能大致把握;面试做题还是蛮考研心理素质的,所以还是只有多刷题提升自己的底气。

一、题目

//某系统中有一空间连续的内存,被划分成多个大小相同的内存块。内存的使用状态记录在字符串 memory 中,每个内存块的状态用字符 x 或 . 表示,其中:
//·         . 表示该内存块空闲;
//·         x 表示该内存块被使用,x 为小写字母。
//现在可释放其中 最多 cnt 个内存块(即字符串中的 x 变成 .),以获得一块空间连续的、且 最长的 空闲内存,请计算并返回该最长空闲内存的内存块数量。
//示例 1:
//输入:
//memory = "..x..x..xx..."
//cnt = 2
//输出:8
//解释:
//
//将 memory[2] 与 memory[5] 的内存块释放,可获得从 memory[0] 到 memory[7]、长度为 8 的连续空闲内存;
//将 memory[5] 与 memory[8] 的内存块释放,可获得从 memory[3] 到 memory[8]、长度为 6 的连续空闲内存;
//将 memory[8] 与 memory[9] 的内存块释放,可获得从 memory[6] 到 memory[12]、长度为 7 的连续空闲内存;
//其他释放方式获得的连续空闲内存都小于 8;
//因此返回 8。
//示例 2:
//输入:
//memory = "....x."
//cnt = 3
//输出:6
//示例 3:
//输入:
//memory = "xx.x..xx....x..."
//cnt = 0
//输出:4
//提示:0 <= cnt <= memory.length <= 10^5

分析:首先这道题采用双指针,我们先拆解,也就是一个字符串连续.最大值,然后就是替换x;将替换后的字符串带入求最大的函数中,即可求解。有了思路之后,编码就比较简单了,但是仍然需要考虑一些边界问题,保证代码健壮。
go 语言版本

func main() {
	in := bufio.NewReader(os.Stdin)
	b,_,_ := in.ReadLine()
	memory := string(b)
	b,_,_ = in.ReadLine()
	newMemory := memory
	cnt,_ := strconv.Atoi(string(b))
	temp := 0
	i := 0
	max := 0
	if cnt == 0 {
		fmt.Println(FindMax(memory))
		return
	}
	for {
		if i >= len(memory) {
		    break
		}
		for j := i;j < len(memory);j++ {
			if fmt.Sprintf("%c",memory[j]) == "x" {
				memory = memory[0:j]+"."+memory[j+1:]
				temp++
				if temp == cnt {
					max = int(math.Max(float64(FindMax(memory)),float64(max)))
					temp = 0
					memory = newMemory
					break
				}
			}
		}
		if temp < cnt {
			max = int(math.Max(float64(FindMax(memory)),float64(max)))
			temp = 0
			memory = newMemory
		}
		i++
	}
	fmt.Println(max)
}

//找连续最大
func FindMax(str string) int {
	i := 0
	j := 0
	max := 0
	for {
		if i >= len(str) {
			break
		}
		temp := 0
		if fmt.Sprintf("%c",str[i]) == "." {
			j = i
		}
		for {
			if j >= len(str) {
				break
			}
			if str[i] == str[j] && fmt.Sprintf("%c",str[i]) == "." {
				temp++
				j++
			}else {
				break
			}
		}
		max = int(math.Max(float64(max),float64(temp)))
		i = j
		if i < len(str) && fmt.Sprintf("%c",str[i]) != "." {
			i++
			j = i
		}
	}
	return max
}

java 版本


public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String memory = sc.nextLine();
        String newMemory = memory;
        char[] ch = memory.toCharArray();
        int cnt = sc.nextInt();
        if (cnt == 0) {
            System.out.println(findMax(memory));
            return;
        }
        int temp = 0;
        int res = 0;
        int j = 0;
        while(j < ch.length) {
            for(int i = j;i<ch.length;i++) {
                if (ch[i] == 'x') {
                    ch[i] = '.';
                    temp++;
                }
                if (temp == cnt) {
                    res  = Math.max(findMax(String.valueOf(ch)),res);
                    temp = 0;
                    ch = newMemory.toCharArray();
                }
            }
            if (temp < cnt) {
                res = Math.max(findMax(String.valueOf(ch)),res);
                temp = 0;
                ch = newMemory.toCharArray();
            }
            j++;
        }
        System.out.println(res);
        return;
    }

    public static int findMax(String s) {
        char[] ch = s.toCharArray();
        int i = 0,j = 0,max = 0;
        while(i < ch.length) {
            int temp = 0;
            if (ch[i] == '.') {
                j = i;
            }
            while(j < ch.length) {
                if(ch[i] == ch[j] && ch[i] == '.') {
                    temp++;
                    j++;
                }else {
                    break;
                }
            }
            max = Math.max(temp,max);
            i++;
        }
        return max;
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
专业面试我的技巧和经验: 一、 巧妇难为无米之炊,事前做一些功课是必须的,把自己学习过的和应聘岗位相关的内容复习下,比如性能与算法岗位:本科电子信息工程和通信工程这些课程肯定学过,通信原理,信息论和编码,信号与系统,数字信号处理,复习一下掌握大概的轮廓一个星期应该差不多可以搞定. 二、 善于引导面试官,比如当面试官问到什么问题不懂的时候,避免连问几个都不懂,可以尝试这么说:我***方面的知识比较匮乏,不是很了解,但是我对***的知识还是比较熟习,我觉得***的知识在我们华为性能与算法工程师必须要掌握的吧。以我面试为例,面试问我3G和4G的关键技术,已经这些关键技术的基本原理,我是做雷达信号处理的,确实不懂。我就和面试官说:对不起,因为研究生期间主要做的雷达信号处理的工作,我对移动通信的知识了解甚少,但是我对移动通信的基础只是比如通信原理和调制解调技术还有一定的了解(当然这都是我事先复习好的),我觉得无论什么类型的通信技术都离不开这些基本的理论。接着面试官就让我说信源编码和信道编码的作用已经他们通常采用的方法,当然我也就能对答如流了。所以,引导很重要。 三、 专业面试对自己简历上不要为了蒙骗面试官,写的项目自己捡不熟悉,对简历上的东西一问三不知,语言表达不清楚,说不半天不能告诉面试官你做的工作内容和意义,这个很不好。 群面 一般10-14个人,看当天应聘的人数而定,分2组,一个话题,让排序之类的,或者辩论之类的,不同的组会抽到不同的问题,不同的地方也会有不同的问题,在这里把问题说出来没什么意义,这一轮会有很多意想不到的情况,比如这组我本来不是选为组长,但是在做总结的时候面试官让我做总结,或者突然问你刚才某某同学说的话你同意吗,或者突然说你今天脸色好像不好看之类的,所以灵机应变才是王道。群面一般要自我介绍,自我介绍要简短,不要说太多,我建议按以下几个方面说,自己学校专业、来自哪里、然后说自己学习,主要稍微说下自己的项目,说下名字就OK了,然后说自己做项目获得成果,比如发表文章,专利和之类的。然后说自己优点和缺点,一般情况下优点缺点都要说,而且我觉得最好优点缺点自己多准备几个,免得到时候你要说的前面的人都说了,就像我们这组:我开始说缺点的时候说我性格比较急,做什么事情都想快点做完,午觉也不睡,但是经常适得其反,中午不谁觉,下午就工作效率低。后面好几个同学说的时候都这么说了,惹的面试官说,你们重复一个东西说。说缺点的时候大家要慎重,不要说和自己工作相关的缺点,比如我们那个组一个同学说:我的缺点就是比较随性,重要场合经常穿拖鞋为此挨了不少批评。 面试官:。。。。(前面省略了一些),你这种随行的行为有同学提醒过你吗?
华为OD Python面试主要包括三个环节:HR面试、知识问答部分和机考。 在HR面试中,面试官主要了解求职者的基本情况,比如简历上所写的基本信息,并询问对薪酬的预期。这一环节主要是为了对求职者进行初步了解和确认。 在知识问答部分,面试官会提问一些关于Python基础知识的问题,比如常见的数据类型、Lambda函数、深复制和浅复制、多线程等。如果求职者有做过小项目,可能还会问到开发框架,比如Django、Tornado、Flask、Twisted等。此外,还会涉及到数据结构算法的问题,比如链表、树、动态规划等。还可能会问到Linux常见指令和数据库基础知识。如果简历上有写项目,也会有相关问题。在这一环节中,求职者需要尽量准确地回答问题,展示自己的基础知识。 最后是机考部分,求职者需要在规定的时间内完成一定数量的编程题目。这一环节主要考察求职者的编程能力和解决问题的能力。在准备机考时,求职者需要熟悉Python编程语法,具备一定的数据结构算法基础,比如栈、队列、树、链表、图等,以及排序、查找、递归、动态规划等算法。刷一定量的LeetCode题目可以帮助求职者提高解题能力。 综上所述,华为OD Python面试主要包括HR面试、知识问答部分和机考,求职者需要准备自己的基本情况、Python基础知识、数据结构算法等,并在机考中展示自己的编程能力和解决问题的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值