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