用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
}

 

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