• 2021/03/08阿里在线笔试问题总结


    两道题目,限时一小时,从零到一完全实现。

    第一题:https://leetcode-cn.com/problems/kth-missing-positive-number/

    第二题:https://leetcode-cn.com/problems/profitable-schemes/

    题目一:

    n张卡片,无重复值,升序排列,想知道从第一张卡片的值开始第k个在卡片中未出现的正整数为多少,并进行返回

    输入输出:

    func main() {
    	T, nArr, kArr, ans := ReadData1()
    	res := make([]int,0)
    	for i:=0;i<T;i++{
    		tmp := solve1(nArr[i],kArr[i],ans[i])
    		res = append(res, tmp)
    	}
    	for i:=0;i<(len(res));i++{
    	
    		fmt.Println(res[i])
    	}
    	
    }
    func ReadData1()(int, []int, []int, [][]int){
    	var (
    		T int
    		n,k int
    		tmp int
    		ans [][]int
    
    	)
    	fmt.Scanln(&T)
    	nArr, kArr := make([]int,T),make([]int,T)
    	for i:=0;i<T;i++{
    		fmt.Scanln(&n, &k)
    		nArr[i] = n
    		kArr[i] = k
    		res := make([]int,n,n)
    		for j :=0;j<n;j++{
    			fmt.Scan(&tmp)
    			res[j] = tmp
    		}
    		ans = append(ans, res)
    	}
    	fmt.Println(ans,T,nArr,kArr)
    	return T, nArr, kArr, ans
    }

    核心方案:

    使用map存放已有的数据值,如果从arr[0]累加,遇到map中有值,进行跳过处理

    func solve1(n, k int,ans []int)int{
    	ansMap := make(map[int]bool, n)
    	for i:=0;i<n;i++{
    		ansMap[ans[i]] = true
    	}
    	val := ans[0]
    	for k > 0 {
    		if _, ok := ansMap[val];!ok{
    			k--
    		}
    		val++
    	}
    	return val-1
    }
    

      

    题目二:

    有m个任务,至多有n个工人,工人之间无差别,每个任务需要的工人数量为a[i],收益为b[i],要求每种方案总收益不少于p,
    求有多少种可行的方案,其中:
    每个文件输入第一行输入一个整数T(《=100》),代表有T组测试数据,接下来T组,每组第一行输入三个整数m,n,p代表任务的数量,
    需要的最多工人数以及需要获得的最少利润,接下来输入m个整数,a[i]代表每一个任务所需的工人数量,输入m个整数,
    b[i]代表每一个任务能获得的收益
    case:
    1
    2 5 3
    2 2
    2 3
    输出
    2 //一二都做或者仅做第二个

    输入输出:

    type Case struct {
    	M,N,P int
    	Nums, Profile []int
    }
    
    
    func ReadData2()([]Case){
    	var (
    		T int
    		m, n, p int
    		tmp int
    
    	)
    	fmt.Scanln(&T)
    	cases := make([]Case, 0)
    	for i:=0;i<T;i++{
    		fmt.Scanln(&m, &n, &p)
    		caseTmp := Case{M:m,N:n,P:p,Nums: make([]int, m),Profile: make([]int, m)}
    
    		res1 := make([]int,2)
    		for k:=0;k<m;k++{
    			for j :=0;j<2;j++{
    				fmt.Scan(&tmp)
    				res1[j] = tmp
    			}
    			caseTmp.Nums[k] = res1[0]
    			caseTmp.Profile[k] = res1[1]
    		}
    		cases = append(cases, caseTmp)
    	}
    	//fmt.Println(cases)
    	return cases
    }
    

    方案:

    暴力破解,求出所有可能的组合,进行判断

    func backpack(val Case) int {
    	cnt := 0
    	arr := make([]int, val.M, val.M)
    	res := make([][]int,0)
    	var sub func(n int)
    	sub = func(n int) {
    		if n >= val.M{
    			tmp := make([]int, len(arr))
    			copy(tmp, arr)
    			res	= append(res, tmp)
    			return
    		}
    		arr[n] = 0
    		sub(n+1)
    		arr[n] = 1
    		sub(n+1)
    		return
    	}
    	sub(0)
    	for i:=0;i<len(res);i++{
    		pro := 0
    		num := 0
    		for j := 0;j<len(res[i]);j++{
    			if res[i][j] == 1{
    				pro += val.Profile[j]
    				num += val.Nums[j]
    			}
    		}
    		if pro>=val.P && num < val.N{
    			cnt++
    		}
    	}
    	return cnt
    }
    

      

    总结:第一题难度不高,但是自己写输入输出的确费点时间,一个小时根本不够用啊

  • 相关阅读:
    基础薄弱的反思
    最短路SPFA
    乌龟棋
    石子归并
    Linux学习2
    java 基础 数组
    java 基础 异常
    java 基础 接口
    java 基础 instance of
    solidity“abi.encode/abi.encodePacked”使用golang编码
  • 原文地址:https://www.cnblogs.com/lvpengbo/p/14502805.html
Copyright © 2020-2023  润新知