每日算法题:算法技树基础6-9

每日算法题

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jayLog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值