每日算法题
csdn算法技能数,基础6-9
前言
题目难度逐渐上升了,从一维线性提到了二维,同时也开始涉及数据结构。第二天已经开始感觉到有点压力了
成绩统计
编写一个程序,建立了一条单向链表,每个结点包含姓名、学号、英语成绩、数学成绩和C++成绩,并通过链表操作平均最高的学生和平均分最低的学生并且输出。
这里我直接使用生成随机数来指代学生成绩。不使用终端输入
tips: 每个学生使用一个结构体。将所有学生存在一个数组或切片中即可。
// 构造一个学生的结构体
type student struct {
Name string
Num string
English int
Math int
Cpp int
}
func Demo6() {
var maxs, mins string
var max, sum int
min := 301
var list [3]student
for i := 0; i < 3; i++ {
// 科目分数直接用随机数,0-100
r1 := rand.Intn(101)
r2 := rand.Intn(101)
r3 := rand.Intn(101)
list[i] = student{
Name: fmt.Sprintf("name%d", i),
Num: fmt.Sprintf("num%d", i),
English: r1,
Math: r2,
Cpp: r3,
}
sum = list[i].English + list[i].Cpp + list[i].Math
if max < sum {
max = sum
maxs = list[i].Name
}
if min > sum {
min = sum
mins = list[i].Name
}
}
fmt.Printf("成绩最高者:%v;成绩最低者:%v", maxs, mins)
fmt.Println()
fmt.Println(list)
}
/*打印:
176
174
202
成绩最高者:name2;成绩最低者:name1
[{name0 num0 65 82 29} {name1 num1 87 48 39} {name2 num2 37 95 70}]
*/
星系炸弹
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。
**tips:**闰年判断,年份能被400整除,能被4整除,不能被100整除
func Demo7() {
days := 1000
year, month, day := 2014, 11, 9
months := []int{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
if year%400 == 0 || (year%4 == 0 && year%100 != 0) {
months[1] = 29
}
for i := 0; i < days; i++ {
day++
if day >= months[month-1] {
day = 1
month++
if month > 12 {
month = 1
year++
// 判断是否为闰年,修改二月天数
if year%400 == 0 || (year%4 == 0 && year%100 != 0) {
months[1] = 29
} else {
months[1] = 28
}
}
}
}
fmt.Printf("贝塔炸弹爆炸的准确时间为:%d年%d月%d日", year, month, day)
}
/*
贝塔炸弹爆炸的准确时间为:2017年9月8日
*/
特别的数的和
小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。
请问,在 1 到 n 中,所有这样的数的和是多少?
输入格式
共一行,包含一个整数 n。
输出格式
共一行,包含一个整数,表示满足条件的数的和。
数据范围 n< 65536
func Demo8() {
var num int16
fmt.Println("请输入一个65535小于的整数")
fmt.Scan(&num)
var ans int16
for i := int16(1); i <= num; i++ {
tmpn := i
for tmpn > 0 {
tmp2 := tmpn % 10
if tmp2 == 1 || tmp2 == 2 || tmp2 == 0 || tmp2 == 9 {
ans += i
break
}
tmpn /= 10
}
}
fmt.Printf("表示满足条件的数的和为:%d", ans)
}
/*
请输入一个65535小于的整数
40
表示满足条件的数的和为:574
*/
蛇形填充
如下图所示,小明用从1 开始的正整数“蛇形”填充无限大的矩阵。
容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20 行第20 列的数是多少?
这道题的解法是暴力破解的,没想到更优的解
直接写入数组,直到写到数字为1000停止。然后获取其中的arr[19][19]
就是要求的答案
func Demo9() {
n, m, i, j := 20, 20, 0, 0
var arr [250][250]int
num := 2
arr[0][0] = 1
for num < 1000 {
//
j++
for {
arr[i][j] = num
num++
if j == 0 {
break
}
j--
i++
}
//
i++
for {
arr[i][j] = num
num++
if i == 0 {
break
}
i--
j++
}
}
fmt.Printf("矩阵中第20 行第20 列的数是%d", arr[19][19])
fmt.Println()
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
fmt.Printf("%d,", arr[i][j])
}
fmt.Println()
}
}
// 矩阵中第20 行第20 列的数是761