第一题、百元喝酒
作业要求:每瓶啤酒2元,3个空酒瓶或者5个瓶盖可换1瓶啤酒。100元最多可喝多少瓶啤酒?(不允许借啤酒)思路:利用递归算法,一次性买完,然后递归算出瓶盖和空瓶能换的啤酒数
package com.wangbr.homework
/**
* @author: wangbr
* @date: 2021-01-29 21:40
* 作业要求:每瓶啤酒2元,3个空酒瓶或者5个瓶盖可换1瓶啤酒。100元最多可喝多少瓶啤酒?
* (不允许借啤酒)思路:利用递归算法,一次性买完,然后递归算出瓶盖和空瓶能换的啤酒数
*/
object Demo1 {
def main(args: Array[String]): Unit = {
// 第一次买共几瓶
var one:Int = 100/2;
println(s"总喝瓶数:${one+process(0,one,one)}")
}
/*
* 总数,上次剩余瓶子,上次剩余瓶盖
*/
def process(sum:Int,bottle:Int,cap:Int):Int = {
if(bottle<3 && cap<5) return sum
var a1 = bottle/3
var a2 = bottle%3
var b1 = cap/5
var b2 = cap%5
println(f"总数=${a1+b1+sum} 上次剩余瓶子=${a1+b1+a2}%02d 上次剩余瓶盖=${a1+b1+b2}%02d")
return process(a1+b1+sum,a1+b1+a2,a1+b1+b2)
}
}
第二题、人机猜拳
作业需求
1. 选取对战角色
2. 开始对战,用户出拳,与对手进行比较,提示胜负信息
3. 猜拳结束算分,平局都加一分,获胜加二分,失败不加分
4 . 循环对战,当输入“n”时,终止对战,并显示对战结果
5. 游戏结束后显示得分
package com.wangbr.homework
import scala.util.control.Breaks._
/**
* @author: wangbr
* @date: 2021-01-29 23:18
* 人机猜拳
* 1.1 作业需求
* 1. 选取对战角色
* 2. 开始对战,用户出拳,与对手进行比较,提示胜负信息
* 3. 猜拳结束算分,平局都加一分,获胜加二分,失败不加分
* 4. 循环对战,当输入“n”时,终止对战,并显示对战结果
* 5. 游戏结束后显示得分
*/
object Demo2 {
def main(args: Array[String]): Unit = {
println("欢迎参加游戏")
//1. 选取对战角色
println("开始选取角色 孙悟空输入[1] 唐僧输入[2]")
var role=scala.io.StdIn.readInt()
while(role !=1 && role !=2){
println("没有这个选项,请重新输入:")
role=scala.io.StdIn.readInt()
}
println(s"您选择的是[${if(role==1)"孙悟空" else "唐僧"}]")
println()
//2. 开始对战,用户出拳,与对手进行比较,提示胜负信息
println("游戏开始")
println("游戏介绍:1.石头输入[1] 2.剪刀输入[2] 3.布输入[3] 4.退出输入[n]")
var result = ""
var score:Int = 0
breakable{
while(true){
println("游请出拳")
result = scala.io.StdIn.readLine()
if(result != "1" && result != "2" && result != "3"){
//4 . 循环对战,当输入“n”时,终止对战,并显示对战结果
if(result == "n") break
println("您输入错误!请重新输入")
}else{
//3. 猜拳结束算分,平局都加一分,获胜加二分,失败不加分
var computer = scala.util.Random.nextInt(3)+1+""
var sco = if(computer == result) 1 else {if((result.toInt-computer.toInt)==1||(result.toInt-computer.toInt)== -2 ) 0 else 2}
println(s"你出的是[${if(result == "1")"石头"else if(result == "2")"剪刀" else "布"}]," +
s"机器出的是[${if(computer == "1")"石头"else if(computer == "2")"剪刀" else "布"}]," +
s"结果您是[${if(sco==2)"胜利" else if(sco == 1) "平局" else "失败"}]")
score += sco
}
}
}
//5. 游戏结束后显示得分
println(s"您的分数是[$score]")
println("bye bye")
}
}
第三题、用户位置时长统计
现有如下数据需要处理:
字段:用户ID,位置ID,开始时间,停留时长(分钟)
4行样例数据:
UserA,LocationA,8,60 UserA,LocationA,9,60 UserB,LocationB,10,60 UserB,LocationB,11,80 样例数据中的数据含义是:用户UserA,在LocationA位置,从8点开始,停留了60钟
处理要求:
1、对同一个用户,在同一个位置,连续的多条记录进行合并
2、合并原则:开始时间取最早时间,停留时长累计求和
package com.wangbr.homework
/**
* @author: wangbr
* @date: 2021-02-03 18:31
*/
case class UserInfo(userName:String,location:String,startTime:Int,duration:Int)
object LocationDemo {
def main(args: Array[String]): Unit = {
val userInfoList:List[UserInfo] = List(
UserInfo("UserA", "LocationA", 8, 60),
UserInfo("UserA", "LocationA", 9, 60),
UserInfo("UserA", "LocationB", 10, 60),
UserInfo("UserA", "LocationB", 11, 80)
)
val userMap = userInfoList.groupBy(t => t.userName+","+t.location)
val orderByUserMap = userMap.mapValues(t =>t.sortBy(x=>x.startTime))
var firstTime = 0
val totalMap = orderByUserMap.mapValues(t =>{
firstTime = t.head.startTime
var sum = t.map(x=> x.duration).sum
sum
})
totalMap.foreach{
case (datas,sumTime)=>println(s"$datas,$firstTime,$sumTime")
}
}
}