用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=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= res && left
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 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
}