当前位置: 首页 > news >正文

【前端面试】随机、结构赋值、博弈题

解构赋值(Destructuring Assignment)是 JavaScript ES6 引入的一项非常有用的特性,它允许我们快速地从数组或对象中提取值,并将它们赋给变量。这种方式使得代码更加简洁、易读,并且能够减少重复的访问和赋值操作。

1. 数组解构赋值

通过解构赋值,我们可以直接从数组中提取值并赋给变量。例如:

// 基本的数组解构赋值
const arr = [1, 2, 3];
const [a, b, c] = arr;console.log(a); // 1
console.log(b); // 2
console.log(c); // 3

说明

  • abc 分别从数组 arr 中提取了值。
  • 解构赋值顺序是按数组的索引顺序进行的。

跳过元素
如果我们只需要数组中的部分元素,可以跳过不需要的元素:

const arr = [1, 2, 3];
const [a, , c] = arr;  // 跳过第二个元素console.log(a); // 1
console.log(c); // 3

默认值
解构时,如果数组的某个位置没有值,可以为该变量提供默认值:

const arr = [1];
const [a, b = 2] = arr;console.log(a); // 1
console.log(b); // 2

2. 对象解构赋值

对象解构赋值允许我们从对象中提取特定的属性并赋给变量。

const person = { name: 'Alice', age: 25 };
const { name, age } = person;console.log(name); // Alice
console.log(age);  // 25

说明

  • 变量名需要与对象属性的名称相同。如果变量名与对象属性名不同,可以通过 : 来重命名:
const person = { name: 'Alice', age: 25 };
const { name: personName, age: personAge } = person;console.log(personName); // Alice
console.log(personAge);  // 25

默认值
如果某个属性在对象中不存在,可以为该属性设置默认值:

const person = { name: 'Alice' };
const { name, age = 30 } = person;console.log(name); // Alice
console.log(age);  // 30

嵌套解构
你还可以对对象进行嵌套解构,从嵌套的对象中提取值:

const person = { name: 'Alice', address: { city: 'Wonderland', zip: '12345' } };
const { name, address: { city, zip } } = person;console.log(name); // Alice
console.log(city); // Wonderland
console.log(zip);  // 12345

3. 解构赋值与剩余操作符

如果你需要从数组或对象中提取出剩余的元素或属性,可以使用剩余操作符 ...

数组的剩余解构

const arr = [1, 2, 3, 4, 5];
const [first, second, ...rest] = arr;console.log(first);  // 1
console.log(second); // 2
console.log(rest);   // [3, 4, 5]

对象的剩余解构

const person = { name: 'Alice', age: 25, city: 'Wonderland' };
const { name, ...otherInfo } = person;console.log(name);     // Alice
console.log(otherInfo); // { age: 25, city: 'Wonderland' }

4. 函数参数中的解构赋值

解构赋值可以与函数参数结合使用,直接从传入的对象或数组中提取值:

数组解构作为函数参数

function sum([a, b]) {return a + b;
}console.log(sum([3, 5])); // 8

对象解构作为函数参数

function greet({ name, age }) {console.log(`Hello, ${name}! You are ${age} years old.`);
}greet({ name: 'Alice', age: 25 }); // Hello, Alice! You are 25 years old.

带默认值的函数参数解构

function greet({ name = 'Guest', age = 18 } = {}) {console.log(`Hello, ${name}! You are ${age} years old.`);
}greet({ name: 'Alice' }); // Hello, Alice! You are 18 years old.
greet(); // Hello, Guest! You are 18 years old.

这段代码 [arr[i], arr[j]] = [arr[j], arr[i]]; 是数组元素交换的语法,属于一种解构赋值的用法。它通常用于交换数组中两个元素的位置。

解释

  1. 解构赋值:这是 JavaScript ES6 中引入的一个特性,允许我们使用数组或对象的结构来进行赋值。

  2. 数组元素交换:在没有解构赋值的语法时,我们通常使用临时变量来交换两个元素,比如:

    let temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
    

    而使用解构赋值的方式可以减少临时变量的使用,使代码更简洁。通过这种方式,arr[i]arr[j] 两个元素的值会交换。

使用场景

这个代码片段在Fisher-Yates 洗牌算法中非常常见,它用于随机打乱数组中的元素顺序。通过不断交换数组中的元素,从最后一个元素开始,逐步将每个元素与之前的元素交换,确保每个元素都有相等的概率出现在数组的任何位置。

示例:Fisher-Yates 洗牌算法实现

function shuffleArray(arr) {for (let i = arr.length - 1; i > 0; i--) {// 随机选择一个索引 j,其中 0 <= j <= iconst j = Math.floor(Math.random() * (i + 1));// 交换 arr[i] 和 arr[j][arr[i], arr[j]] = [arr[j], arr[i]];}
}const arr = [1, 2, 3, 4, 5];
shuffleArray(arr);
console.log(arr); // 打乱顺序后的数组

这段代码的关键点:

  • Fisher-Yates 洗牌算法:这个算法的核心思想是从数组的最后一个元素开始,随机选择一个元素并与当前元素交换位置,直到整个数组都经过处理。这确保了数组中每个元素出现的顺序是随机的。
  • 解构赋值:通过 [arr[i], arr[j]] = [arr[j], arr[i]]; 来简洁地交换元素,无需使用额外的临时变量。

以下是将上述题目改成先输后赢情况的题目及对应答案,也就是目标变为让对方拿到最后一颗石子、最后一枚硬币等情况来取得胜利,供你参考:

💡题目 1:取石子游戏(先输后赢版)

  • 有一堆石子,共 100 颗。甲、乙两人轮流从中取石子,每次最少取 1 颗,最多取 5 颗。取到最后一颗石子的人输。假设甲先取,问甲有没有必胜策略?如果有,甲第一步应该取几颗石子?

答案:

甲有必胜策略。因为要让乙取到最后一颗石子(即甲要避免取到最后一颗),那就需要保证每轮两人共取 6 颗石子(1 + 5 = 6,2 + 4 = 6,3 + 3 = 6 等情况),使得最后剩下 1 颗留给乙。100÷6 = 16……4,甲先取 4 颗石子,之后乙取 n 颗(1≤n≤5),甲就取 6 - n 颗,这样经过 16 轮后,就会剩下 1 颗石子留给乙去取,乙取到最后这颗石子,甲获胜。

💡题目 2:硬币游戏(先输后赢版)

  • 桌上有 20 枚硬币,A、B 两人轮流拿硬币,每次可以拿 1 到 3 枚。谁拿到最后一枚硬币谁输。假设 A 先拿,A 有没有必胜策略?

答案:

A 有必胜策略。要保证 B 拿到最后一枚硬币,就要使得最后一轮留给 B 时只剩下 1 枚硬币。因为每次两人能取 1 到 3 枚,若想控制每轮取的数量,让两人一轮共取 4 枚硬币(1 + 3 = 4,2 + 2 = 4,3 + 1 = 4)是可行的。20÷4 = 5,没有余数,A 先拿 1 枚硬币,之后 B 拿 n 枚(1≤n≤3),A 就拿 4 - n 枚,这样经过 4 轮后,会剩下 1 枚硬币留给 B 去拿,A 获胜。

💡题目 3:划分数字(先输后赢版)

  • 给定数字 10,A、B 两人轮流进行操作。操作可以是将当前数字减去 1 或者减去 2。谁先将数字减到 0 谁输。假设 A 先操作,A 有没有必胜策略?

答案:

A 有必胜策略。A 要避免自己把数字减到 0,那就需要让 B 去减到 0,所以 A 第一次要将 10 减去 2 变为 8。之后 B 操作,如果 B 减 1,A 就减 2;如果 B 减 2,A 就减 1,保证每轮两人共减去 3。因为 8÷3 = 2……2,经过 2 轮后,数字变为 2,此时不管 B 减 1 还是减 2,A 都能进行相应操作使得最后 B 把数字减到 0,A 获胜。

💡题目 4:报数游戏(先输后赢版)

  • A、B 两人轮流报数,从 1 开始报,每次可以报 1 个或 2 个连续的数。谁报到 20 谁输。假设 A 先报,A 有没有必胜策略?

答案:

A 有必胜策略。A 要避免报到 20,要让 B 报到 20。A 先报 1 个数,报 1。然后 B 报数,如果 B 报 1 个数,A 就报 2 个数;如果 B 报 2 个数,A 就报 1 个数,保证每轮两人共报 3 个数。因为 (20 - 1)÷3 = 6……1,经过 6 轮后,正好轮到 B 报数,此时 B 只能报 20,B 输,A 获胜。

💡题目 5:火柴游戏(先输后赢版)

  • 有 15 根火柴,A、B 两人轮流取火柴,每次可以取 1 根、2 根或 3 根。取到最后一根火柴的人输。假设 A 先取,A 有没有必胜策略?

答案:

A 有必胜策略。A 要让 B 取到最后一根火柴,也就是要保证最后剩下 1 根留给 B。因为每次两人取 1 到 3 根,控制每轮两人共取 4 根火柴(1 + 3 = 4,2 + 2 = 4,3 + 1 = 4)就行。15÷4 = 3……3,A 先取 3 根火柴,剩下 12 根,然后 B 取 n 根(1≤n≤3),A 就取 4 - n 根,这样经过 3 轮后,就会剩下 1 根火柴留给 B 去取,A 获胜。

相关文章:

【前端面试】随机、结构赋值、博弈题

解构赋值&#xff08;Destructuring Assignment&#xff09;是 JavaScript ES6 引入的一项非常有用的特性&#xff0c;它允许我们快速地从数组或对象中提取值&#xff0c;并将它们赋给变量。这种方式使得代码更加简洁、易读&#xff0c;并且能够减少重复的访问和赋值操作。 1.…...

Volta——开箱即用的Node.js 版本管理工具

Volta volta 是一个较新的 Node.js 版本管理器&#xff0c;旨在简化 Node.js 和其他工具的安装和管理&#xff0c;在 2019 年出世&#xff0c;仍在积极开发中。Volta 采用了与 nvm 不同的方法&#xff1a;它不是管理 Node.js 的多个版本&#xff0c;而是管理项目及其依赖项。当…...

ubuntu 磁盘空间满,找不到占用文件的目录

解决方法&#xff1a; 检查磁盘空间&#xff1a; 执行 df -h 查看各分区磁盘使用情况。 查找大文件或目录&#xff1a; 执行 du -sh /* 2>/dev/null 查找根目录下的大文件或目录&#xff0c;再逐一进入子目录使用相同命令查找。 清理缓存和临时文件&#xff1a; 清理 /t…...

1. 机器学习基本知识(5)——练习题(参考答案)

20.&#x1f517;本章代码笔记&#x1f4d3;链接&#xff08;需要&#x1fa9c;&#xff09;&#xff1a;&#xff08;01_the_machine_learning_landscape.ipynb - Colab (google.com)&#xff09; 如果你不想通过上面的官方网址下载本章的笔记&#xff0c;还可以在本篇博文的…...

spark-sql 备忘录

wordcount sc.textFile("../data/data.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(__).collect 读取json 文件 并通过sql 执行 join 查询 public static void main(String[] args) {SparkSession session SparkSession.builder().master(&qu…...

基于softmax回归的多分类

基于softmax回归的多分类任务是机器学习领域中的一种常见应用。softmax回归,又称多项逻辑回归或多类逻辑回归,是逻辑回归在多分类问题上的推广。以下是对基于softmax回归的多分类任务的详细解释: 一、softmax回归的原理 softmax回归的核心思想是通过softmax函数将输入数据…...

bs4基本运用

1. bs4基本使用 1.1. 简介 bs4的全称为 BeautifulSoup。和lxml一样&#xff0c;是一个html的解析器&#xff0c;主要功能也是解析数据和提取数据 。 本模块作为了解模块&#xff0c;实际开发中很少用这个模块去解析数据&#xff0c;大家可能会想为什么这个模块会逐渐被淘汰&…...

MySQL 时区参数 time_zone 详解

文章目录 前言1. 时区参数影响2. 如何设置3. 字段类型选择 前言 MySQL 时区参数 time_zone 有什么用&#xff1f;修改它有什么影响&#xff1f;如何设置该参数&#xff0c;本篇文章会详细介绍。 1. 时区参数影响 time_zone 参数影响着 MySQL 系统函数还有字段的 DEFAULT CUR…...

Redis - 消息队列 Stream

一、概述 消息队列 定义 消息队列模型&#xff1a;一种分布式系统中的消息传递方案&#xff0c;由消息队列、生产者和消费者组成消息队列&#xff1a;负责存储和管理消息的中间件&#xff0c;也称为消息代理&#xff08;Message Broker&#xff09;生产者&#xff1a;负责 产…...

Docker:国内加速源

阿里云docker加速云&#xff1a; sudo tee /etc/docker/daemon.json <<EOF { “registry-mirrors”: [“https://euf11uji.mirror.aliyuncs.com”] } EOFhttps://docker.mozhu.dev/ sudo tee /etc/docker/daemon.json <<EOF {"registry-mirrors": [&qu…...

Android Studio更改项目使用的JDK

一、吐槽 过去&#xff0c;在安卓项目中配置JDK和Gradle的过程非常直观&#xff0c;只需要进入Android Studio的File菜单中的Project Structure即可进行设置&#xff0c;十分方便。 原本可以在这修改JDK: 但大家都知道&#xff0c;Android Studio的狗屎性能&#xff0c;再加…...

ubuntu+ros新手笔记(四):gazebo无法加载

以下为ChatGPT 的解决方案&#xff0c;对我来说是可行的&#xff01;&#xff01; 我按照第2步操作就解决辣&#xff01;&#xff01; 我的提问&#xff1a; 在ubuntu 22.04 和ros2 humble环境下&#xff0c;gazebo加载不了 ChatGPT 回答&#xff1a; 在 Ubuntu 22.04 和 …...

vue季度选择器(antd2.0 版本无此控件,单独写一个)

vue季度选择器 效果显示 效果显示 <template><div><a-popoverplacement"bottom"overlayClassName"season-picker"trigger"click"v-model"showSeason"><template #content><div class"season-picker-b…...

C/C++代码性能优化技巧的书籍及资料

使用C/C开发的场景&#xff0c;大多对代码的执行的速度&#xff0c;实时性有较高的要求&#xff0c;像嵌入式系统的开发&#xff0c;资源还受限。在算力存储空间有限的MCU上写出简洁又高效的代码实际是一种艺术。软件工程师在代码设计上的这种差距&#xff0c;会反映在产品的性…...

通俗易懂的 Nginx 反向代理 配置

通俗易懂的 Nginx 反向代理 配置 首先 root 与 alias 的区别 root 是直接拼接 root location location /i/ {root /data/w3; }当请求 /i/top.gif &#xff0c;/data/w3/i/top.gif 会被返回。 alias 是用 alias 替换 location location /i/ {alias /data/w3/images/; }当请…...

docker设置容器自动启动

说起开机自动启动应该很多人都遇到过&#xff0c;我们公司做的系统很多的中间件都没有设置开机自动启动然后中间修改问题又设置了一些临时生效的文件&#xff0c;开始的时候大家都不以为意&#xff0c;知道公司陆续有人离职入职管理交接一塌糊涂&#xff0c;项目成了历史遗留问…...

蓝桥杯刷题——day1

蓝桥杯刷题——day1 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 给定一个字符串 s &#xff0c;验证 s 是否是 回文串 &#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。本题中&#xff0c;将空字符串定义为有效的 回文串 。 题目链接&a…...

Leetcode 面试150题 399.除法求值

系列博客目录 文章目录 系列博客目录题目思路代码 题目 链接 思路 广度优先搜索 我们可以将整个问题建模成一张图&#xff1a;给定图中的一些点&#xff08;点即变量&#xff09;&#xff0c;以及某些边的权值&#xff08;权值即两个变量的比值&#xff09;&#xff0c;试…...

活动预告 |【Part2】Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识

课程介绍 通过参加“Microsoft 安全在线技术公开课&#xff1a;安全性、合规性和身份基础知识”活动提升你的技能。在本次免费的介绍性活动中&#xff0c;你将获得所需的安全技能和培训&#xff0c;以创造影响力并利用机会推动职业发展。你将了解安全性、合规性和身份的基础知…...

Unity游戏实战

很小的时候在键盘机上玩过一个游戏叫寻秦&#xff0c;最近看有大佬把他的安卓版做出来了&#xff0c;打开封面就是Unity&#xff0c;想自己也尝试一下。...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...