当前位置: 首页 > 面试经验 >

4.9 小红书笔试代码,菜狗求大佬指正

优质
小牛编辑
91浏览
2023-04-09

4.9 小红书笔试代码,菜狗求大佬指正

求大佬纠正代码错误二、三题

package main

import (
	"fmt"
	"sort"
)

func main() {
	var n, X, C, temp, ans int
	fmt.Scan(&n, &X, &C)
	volume := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&temp)
		volume[i] = temp
	}

	var mySlice []int
	var cases [][]int
	var dfs func(int)
	dfs = func(i int) {
		if i == 6 {
			if sum(mySlice) == C {
				cases = append(cases, mySlice)
			}
			return
		}
		for j := 0; j < len(volume); j++ {
			mySlice = append(mySlice, volume[j])
			dfs(i + 1)
			mySlice = mySlice[:len(mySlice)-1]
		}
	}
	dfs(0)
	fmt.Println(cases)
	myMap := make(map[int]int, len(cases[0]))
	for i := 0; i < n; i++ {
		fmt.Scan(&temp)
		myMap[volume[i]] = temp
	}
	var temp2 int
	for i := 0; i < len(cases); i++ {
		for j := 0; j < len(cases[i]); j++ {
			temp2 += myMap[cases[i][j]]
		}
		add := react(cases[i], X)
		temp2 += add
		ans = max(ans, temp2)
	}
	fmt.Println(ans)
}

func sum(mySlice []int) int {
	sum1 := 0
	for i := 0; i < len(mySlice); i++ {
		sum1 += mySlice[i]
	}
	return sum1
}

func react(singleCase []int, X int) int {
	sort.Ints(singleCase)
	var add int
	for i := 0; i < len(singleCase)-1; i++ {
		if singleCase[i] == singleCase[i+1] {
			add += X
		}
	}
	return add
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

思路是先回溯,把所有值等于C的存到一个列表里,再用map把这个列表中每个体积和物质量对应起来,最后遍历相加再加上反应后的生成的物质量,记录并保留最大的,我自己调试的时候回溯那里一直有问题...取不到正确的cases

package main

import "fmt"

func main() {
	var n, temp, m int
	var s string
	fmt.Scan(&n)
	begin := make(map[int]int, n)
	beginList := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&temp)
		begin[i] = temp
		beginList[i] = temp
	}
	fmt.Scan(&s)
	for k, v := range s {
		if v == 'R' {
			begin[k] += 1000000
		} else {
			begin[k] += 1000001
		}
	}
	fmt.Scan(&m)
	timeEvent := make(map[int]int, m)
	tempSlice := make([]int, m)
	for i := 0; i < m; i++ {
		fmt.Scan(&temp)
		tempSlice[i] = temp
	}
	for i := 0; i < m; i++ {
		fmt.Scan(&temp)
		timeEvent[tempSlice[i]] = temp
	}
	var time int
	for time < tempSlice[len(tempSlice)-1] {
		timer(begin, beginList)
		for k, v := range timeEvent {
			if time == k {
				if v == 0 {
					fmt.Println(sum(begin))
				} else if v > 0 {
					begin[v] = begin[beginList[v]]
				} else if v < 0 {
					delete(begin, beginList[v])
				}
			}
		}
	}
}

func timer(myMap map[int]int, list []int) {
	for k, _ := range myMap {
		if myMap[k]%1000000 == list[k] {
			myMap[k]++
		} else {
			myMap[k]--
		}
	}
}

func sum(myMap map[int]int) int {
	var add int
	for _, v := range myMap {
		add += v
	}
	return add
}

思路是将每个球初始值先存到一个切片里,然后再构造一个map映射编号和初始值,后接到设定是红还是蓝的字符串后,遍历它,如果为R则给map相同索引上的值加1000000,否则加1000001,因为每过一个时间点,通过对1000000取余之后判断是否和初始切片中的值一样来决定是加1还是减1

构造时间点和事件映射的map,之后在时间未超过最后一个时间点时,通过判断事件的正负(v)来做相应操作

这道题写的时候时间不多,有一些代码冗余和很多可以优化的地方

最后输入那一块时间没来得及,我都没写...但我感觉这个思路应该可行.....

恳请大佬们指正一起讨论一下这两段代码的问题,我后续会再去调试一下看看能不能多过几个用例...

#小红书信息集散地##我的实习求职记录#
 类似资料: