用golang刷牛客网公司真题

用Go语言刷牛客网真题记录,只是为了练习Go语言,能力有限不保证都是最优解,只能在此抛转引玉了。

1、腾讯2018春招技术类编程题汇总--题一

翻转数列:

小Q定义了一种数列称为翻转数列:
给定整数n和m, 满足n能被2m整除。对于一串连续递增整数数列1, 2, 3, 4..., 每隔m个符号翻转一次, 最初符号为'-';。
例如n = 8, m = 2, 数列就是: -1, -2, +3, +4, -5, -6, +7, +8.
而n = 4, m = 1, 数列就是: -1, +2, -3, + 4.
小Q现在希望你能帮他算算前n项和为多少。

输入描述:

输入包括两个整数n和m(2 <= n <= 109, 1 <= m), 并且满足n能被2m整除。

输出描述:

输出一个整数, 表示前n项和。

输入例子1:

8 2

输出例子1:

8

我的解法:

package main

import (
	"fmt"
	"math"
)

func main() {
	var n,m int
	for {
		a, _ := fmt.Scanln(&n, &m)
		if a == 0{
			return
		}
		if n<2 || n>int(math.Pow10(9)) || m < 1 {
			return
		}
		if n%(2*m) != 0{
			return
		}
		var count int
		count = 0
		count = demo(n,m,count)
		fmt.Println(count)
	}
}

func demo(n, m, count int) int{
	tmp := m
	i := 1
	j := 1
	for i<=n {
		flag := math.Pow(-1, float64(j))
		for tmp > 0 {
			count += int(flag)*i
			tmp--
			i++
		}
		tmp = m
		j++
	}
	return count
}

2、腾讯2018春招技术类编程题汇总--题二

纸牌游戏:

牛牛和羊羊正在玩一个纸牌游戏。这个游戏一共有n张纸牌, 第i张纸牌上写着数字ai。
牛牛和羊羊轮流抽牌, 牛牛先抽, 每次抽牌他们可以从纸牌堆中任意选择一张抽出, 直到纸牌被抽完。
他们的得分等于他们抽到的纸牌数字总和。
现在假设牛牛和羊羊都采用最优策略, 请你计算出游戏结束后牛牛得分减去羊羊得分等于多少。

输入描述:

输入包括两行。
第一行包括一个正整数n(1 <= n <= 105),表示纸牌的数量。
第二行包括n个正整数ai(1 <= ai <= 109),表示每张纸牌上的数字。

输出描述:

输出一个整数, 表示游戏结束后牛牛得分减去羊羊得分等于多少。

输入例子1:

3
2 7 4

输出例子1:

5

我的解答:

package main

import "fmt"

func main() {
	var num int
	//输入导致不能ac
	/*read := bufio.NewReader(os.Stdin)
	for {
		n, _ := fmt.Scanln(&num)
		if n == 0 {
			return
		}
		if num<1 || float64(num)>math.Pow10(5){
			return
		}
		reader, _, _ := read.ReadLine()
		if len(reader) <= 0 {
			return
		}
		array := strings.Split(string(reader)," ")
		if len(array) != num {
			return
		}
		var arr []int
		for _,v:= range array{
			data, _:=strconv.Atoi(v)
			if float64(data) > math.Pow10(9) {
				return
			}
			arr = append(arr, data)
		}
		//sort2.Ints(arr)
		fastsort(arr,0,num-1)
		//fmt.Println(arr)
		fmt.Println(getdiff(arr, num,0))
	}*/
	n, _ := fmt.Scan(&num)
	if n==0 {
		return
	}
	var arr []int
	arr = make([]int, num)
	for i:=0;i<num;i++{
		n2, _ := fmt.Scan(&arr[i])
		if n2 == 0 {
			return
		}
	}
	fastsort(arr,0,num-1) //快排才能ac
	//sort2.Ints(arr)
	fmt.Println(getdiff(arr, num,0))
}

func getdiff(arr []int, num, count int) int{
	/*flag := 0
	for i:=num-1;i>=0;i--{
		count += int(math.Pow(-1,float64(flag)))*arr[i]
		flag++
	}*/
	for k,v := range arr{
		if k%2 == 0{
			count += v
		} else {
			count -= v
		}
	}
	return count
}

func fastsort(arr []int, left, right int) {
	if left >= right{
		return
	}
	index := index(arr, left, right)
	fastsort(arr,left,index-1)
	fastsort(arr,index+1,right)
}

func index(arr []int, left, right int) int{
	res := arr[left]
	for left < right{
		for arr[right] <= res && left<right{
			right--
		}
		arr[left] = arr[right]
		for arr[left] >= res && left<right{
			left++
		}
		arr[right] = arr[left]
	}
	arr[right] = res
	return right
}

3、腾讯2018春招技术类编程题汇总--题三

贪吃的小Q:

小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力

输入描述:

每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,表示父母出差的天数N(N<=50000)和巧克力的数量M(N<=M<=100000)。

输出描述:

输出一个数表示小Q第一天最多能吃多少块巧克力。

输入例子1:

3 7

输出例子1:

4

我的解答:

package main

import (
	"fmt"
	"math"
)

func main() {
	var N,M int
	n, _ := fmt.Scan(&N, &M)
	if n==0{
		return
	}
	fmt.Println(howMany(N,M))
}

func howMany(N,M int) int{
	low := 1
	high := M
	for low <= high {
		mid := (low+high)/2
		enough := true
		remain := M
		eat := mid
		for i:=0;i<N;i++{
			if eat > remain {
				enough = false
				break
			}
			remain -= eat
			//eat = (eat + 1)/2
			eat = int(math.Ceil(float64(eat)/2))
		}
		if enough {
			low = mid + 1
		} else {
			high = mid - 1
		}
	}
	return high
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章