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
}

  

總結:第一題難度不高,但是自己寫輸入輸出的確費點時間,一個小時根本不夠用啊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM