2023/6/30

文章介绍了如何使用JavaScript处理二维数组,包括行优先和列优先遍历计算学生平均成绩,以及实现扑克牌的洗牌和发牌功能。此外,还详细讲解了约瑟夫环问题的解决方法,通过循环和条件判断找到最后留在圈中的人的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、二维数组的两种优先遍历方式

//例:二维数组中记录了5名学生3个科目的考试成绩,请算出每名学生的平均成绩和各科的平均成绩
let a=[
    ["张三",78,84,90],
	["李四",75,88,95], 	
    ["王五",70,90,86],
	["赵六",79,85,91],
 	["冯七",90,87,90]
]

//行优先遍历方式
for(let i=0;i<a.length;i++){
    let p1=0;                                   //p1为学生3科总成绩
    for(let j=1;j<a[i].length;j++){
        p+=a[i][j];
    }
    console.log(`${a[i][0]}的平均成绩为:${(p1/(a[i].length-1)).toFixed(2)}分`)
}

//列优先遍历方式
let b=["语文","高数","计算机"];
for(let j=1;j<a[0].length;j++){
    let p2=0;                                  //p2为每科总成绩
    for(let i=0;i<a.length;i++){
        p+=a[i][j];
    }
    console.log(`${b[j-1]}的平均成绩为:${(p2/a.length).toFixed(2)}分`)
}

toFixed(2)                ----把得出的结果四舍五入保留两位小数

2、扑克牌的洗牌发牌

//将54张扑克牌放入数组中,单击“洗牌”按钮,对数组中的扑克牌进行洗牌。单击“发牌”按钮,将
扑克牌分发给三个游戏者。



//创建数组为其赋值
let poker=new Array(54);
poker[0]="大王";
poker[1]="小王";
let flower=["♥","♣","♦","♠"];
let point=["A","2","3","4","5","6","7","8","9","10","J","Q","K"];
let i=2;
for(let j=0;j<flower.length;j++){
	for(let k=0;k<point.length;k++){
		poker[i]=`${flower[j]}${point[k]}`;
		i++;
	}
}

console.log(`原扑克牌:${poker}`)

//洗牌
function btnWash(){
	for(let i=0;i<poker.length;i++){
		let randomIndex=Number.parseInt(Math.random()*poker.length);
		[poker[randomIndex],poker[i]]=[poker[i],poker[randomIndex]]
	}
	console.log(`洗完牌后:${poker}`)
}

//发牌
function btnSend(){
	let p1=[];
	let p2=[];
	let p3=[];                                //p1,p2,p3为3个玩家
	for(let i=0;i<poker.length;i+=3){
		p1.push(poker[i]);
		p2.push(poker[i+1]);
		p3.push(poker[i+2]);
	}
	p1.sort(function(a,b){
		return a.slice(1).charCodeAt(0)-b.slice(1).charCodeAt(0);  //截取元素获得其Ascii码
	})
	p2.sort(function(a,b){
		return a.slice(1).charCodeAt(0)-b.slice(1).charCodeAt(0);
	})
	p3.sort(function(a,b){
		return a.slice(1).charCodeAt(0)-b.slice(1).charCodeAt(0);
	})
	console.log(`p1:${p1}`);
	console.log(`p2:${p2}`);
	console.log(`p3:${p3}`);

}

3、约瑟夫环问题:17个人排成一圈。编号为0的人开始从1报数,凡报到3的倍数的人离开圈子。这样不断循环下去,圈子里的人将不断减少。当只剩下一个人时,问此人原来的位置是多少号?

//设当人出圈后,数组指定的元素为-1。

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

1

2

-1

4

5

-1

7

8

-1

10

11

-1

13

14

-1

16

17

-1

19

20

-1

22

23

-1

25

26

-1

28

29

-1

31

32

-1

34

35

-1

37

38

-1

40

41

-1

43

44

-1

46

47

-1

49

let joseph=new Array(17);
let number=1;
let count=joseph.length;      // 统计数组中不是-1的元素的个数
while(count!==1){
	for(let i=0;i<joseph.length;i++){
		if(joseph[i]!==-1){
			if(number%3){
				joseph[i]=number;
			}else{
				joseph[i]=-1;
			}
			number++;
		}
	}
	console.log(joseph);
	// 计算数组中不是-1的元素的个数
	/*count=0;
	for(let i=0;i<joseph.length;i++){
		if(joseph[i]!==-1){
			count++;
		}
	}*/
	count=joseph.filter(function(item){
		return item!==-1;
	}).length;
}
let index=joseph.findIndex(function(item){
	return item!==-1;
})
console.log(`最后一个人的位置是:${index}`);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值