记录大厂一道笔试题 

描述:

迈克  负责下肉,下肉的个数为 n个,n>=1

汤姆 负责吃,吃肉的速率是m秒,(每次只能吃一块肉)  m<=1000

(x,y)

x 表示 肉在第x秒下锅,

y 表示 肉下锅过y秒最美味(即汤姆吃到最合适) 

题目实例:

n:3    m:1

后三行,代表x,y的数组

1     2

1     3

2     3

 

解题思路:

画个时间轴,题目就迎刃而解了

编号

A   1   2

B   1   3

C   2   3

可以接续加,调试时,需要验证

       C

             v----------------v

       B

       v----------------v

       A              

       v----------v

|___|___|___|___|___|___|___|___|___|___|__>

0    1     2     3     4     5     6     7     8      9     10

       D

                           v----------v

从上图可以看出,这是一道,闭区间去重的问题(区间右点和汤姆吃肉时间点一致,即可记录这个区间点)

 

但题目有不严谨的地方。

1、从A B 看,同一时间点,可以下多块肉;

2、同一时间点,不能即下肉又捞肉??

实时上,再我加了D: 4  2 后

系统结果是3,而不是4!!?? wtf。。

 

package main

import (
	"fmt"
)

func main() {
    list := []*St{{1, 2}, {1, 3}, {2, 3}, {4, 2}}
	res := CreateFunc(3, 1, list)
	fmt.Println(res)
}

type St struct {
	x int
	y int
}

func uniqueInts(a []int) (b []int) {
	m := map[int]bool{}
	for _, v := range a {
		if _, ok := m[v]; !ok {
			b = append(b, v)
			m[v] = true
		}
	}
	return b
}

func parseList(goal int, putList []int) bool {
	for _, p := range putList {
		if p == goal {
			return true
		}
	}
	return false
}

func CreateFunc(totalNum, speed int, list []*St) int {
	var goalList []int
	var putList []int
	for _, v := range list {
		time := v.x + v.y
		if time%speed == 0 {
			goalList = append(goalList, time)
			putList = append(putList, v.x)
		}
	}
	goalList = uniqueInts(goalList)

	var goalFinalList []int
	for _, v := range goalList {
		if parseList(v, putList) {
			continue
		} else {
			goalFinalList = append(goalFinalList, v)
		}
	}
	return len(goalFinalList)
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值