华为OD机考
大家好啊,刚刚考完华为OD的机试,有个问题想问一下大家,就是每个题目是只能提交一次呢,还是可以提交多次的呢?不包括自测的。比如我第二道题,第一次提交,通过率是50,第二次提交是100,那最后算成绩是算50还是100呢?
题目1.给定货车能装的货物总量,给定n个货物的重量,求货车能装的货物的最大个数。 ex. 20 2 4 5 8 11
一开始太紧张想叉了,想着去用动态规划,其实只要把货物的重量从小到大排序,然后相加看会不会超过货车限制即可,因为是求个数,不是求总重量。
题目2:打牌,求最长的同花顺问题。
我是这么做的,开一个数组,把所有的牌的个数统计起来,J对应索引11,Q对应索引12,2和大小王放前面即可,因为他们不会构成同花顺,然后遍历这个数组,从3开始遍历,找到不含4的最长的串,并且长度大于等于5,并且要大于等于之前统计的最大长度,因为题目意思是要覆盖,然后按照这个长度把数组的索引加入到SB中,注意,如果是11,12,13,14,要转化回JQKA
题目3:构造一块内存,内存长度100,命令有请求一段内存和释放一段内存,以及要求的长度。
题目1.给定货车能装的货物总量,给定n个货物的重量,求货车能装的货物的最大个数。 ex. 20 2 4 5 8 11
一开始太紧张想叉了,想着去用动态规划,其实只要把货物的重量从小到大排序,然后相加看会不会超过货车限制即可,因为是求个数,不是求总重量。
题目2:打牌,求最长的同花顺问题。
我是这么做的,开一个数组,把所有的牌的个数统计起来,J对应索引11,Q对应索引12,2和大小王放前面即可,因为他们不会构成同花顺,然后遍历这个数组,从3开始遍历,找到不含4的最长的串,并且长度大于等于5,并且要大于等于之前统计的最大长度,因为题目意思是要覆盖,然后按照这个长度把数组的索引加入到SB中,注意,如果是11,12,13,14,要转化回JQKA
题目3:构造一块内存,内存长度100,命令有请求一段内存和释放一段内存,以及要求的长度。
我是这么做的:开一个100大小的数组,请求内存时,从数组开头开始遍历,找到一段长度是要求的长度的并且全是0的一段,把它的值设为一个不为0的值,这个值在后面释放内存的时候要用到,比如 1111100000,这是申请5个大小的内存,如果申请的空间大小为0,输出error
释放内存时,给的数字是释放内存的首地址。这时候就要看,如果这个首地址的值是0,说明无需释放,输出error, 然后再看,这个内存地址的前面的那个值和这个值是不是相等,或者这个内存地址的位置是0, 如果相等的话,说明这个内存地址的首地址是在一段连续内存的中间,就不允许释放,比如 1111100000,首地址为3,这时候就不能释放,输出error。
还有一种要考虑,在释放时,怎么才能释放这个首地址所在的内存,而不会释放后面的内存呢,这个时候我们要想到前面申请内存的时候,给这个内存空间赋值,赋值要赋不一样的值,否则谁知道这个位置属于谁呢? 但是怎么赋不一样的值呢,我的做法是,再开一个100长度 的数组,这个数组用来标记的,比如第一次申请内存,遍历这个标记数组,找到第一个为0 的索引,然后在内存数组中进行标记,比如111000,然后第二次申请内存时,再遍历标记数组,这时候,第一个为0的索引是1,就在内存数组中进行标记,比如 111222,这样,在释放的时候,就可以很明确的释放一段相同的内存,释放的时候,不要忘了,要把对应的标记给还原成0,否则后面再申请内存的时候标记就会出问题。
答题思路仅供参考,欢迎交流探讨,共勉,加油吧
#华为##华为od##华为机试##华为笔试##华为招聘#