每日两题 T6
算法
LeetCode T999. 车的可用捕获量[1]
描述
在一个 8 x 8 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “R”,“.”,“B” 和 “p” 给出。大写字符表示白棋,小写字符表示黑棋。
车按国际象棋中的规则移动:它选择四个基本方向中的一个(北,东,西和南),然后朝那个方向移动,直到它选择停止、到达棋盘的边缘或移动到同一方格来捕获该方格上颜色相反的卒。另外,车不能与其他友方(白色)象进入同一个方格。
返回车能够在一次移动中捕获到的卒的数量。
示例 1:
输入:[[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","R",".",".",".","p"],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:3
解释:
在本例中,车能够捕获所有的卒。
示例 2:
输入:[[".",".",".",".",".",".",".","."],[".","p","p","p","p","p",".","."],[".","p","p","B","p","p",".","."],[".","p","B","R","B","p",".","."],[".","p","p","B","p","p",".","."],[".","p","p","p","p","p",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:0
解释:
象阻止了车捕获任何卒。
示例 3:
输入:[[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","p",".",".",".","."],["p","p",".","R",".","p","B","."],[".",".",".",".",".",".",".","."],[".",".",".","B",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:3
解释:
车可以捕获位置 b5,d6 和 f5 的卒。
提示:
•board.length == board[i].length == 8•board[i][j] 可以是 'R','.','B' 或 'p'•只有一个格子上存在 board[i][j] == 'R'
分析
没下过国际象棋,题目有读不懂,放弃!
其实,描述说的问题我们通过图来说明,以白色车为原点,向上下、左右试探。
所以我们首先找到白色车所在位置,然后遍历获取到 X
向、Y
向数组,并且过滤掉空白块,得到的数组我们只需要从第一个"p"开始找,到下一个"p"或者墙结束
代码
/**
* @param {character[][]} board
* @return {number}
*/
var numRookCaptures = function(board) {
let y, xlist = [], ylist = [], boardXLen = 8;
for (let i = 0; i < boardXLen; i++) {
if (board[i].indexOf('R') > -1) {
y = board[i].indexOf('R')
xlist = board[i].filter(e => e !== '.')
}
}
for (let i = 0; i < boardXLen; i++) {
board[i][y] !== '.' && ylist.push(board[i][y])
}
let rx = xlist.indexOf('R'), ry = ylist.indexOf('R'), num = 0
if(xlist[rx+1] && xlist[rx+1] === 'p') ++num
if(xlist[rx-1] && xlist[rx-1] === 'p') ++num
if(ylist[ry+1] && ylist[ry+1] === 'p') ++num
if(ylist[ry-1] && ylist[ry-1] === 'p') ++num
return num
};
JavaScript
ES5和ES6 的继承有什么区别?
•class
声明变量会提升,但不会初始化赋值。变量进入暂时性死区,类似于 let
、const
声明
const p = new People(); // it's ok
function People() {
this.bar = 1;
}
const m = new Man(); // ReferenceError: Foo is not defined
class Man {
constructor() {
this.foo = 1;
}
}
•class
声明内部会启用严格模式
function People() {
baz = 1; // it's ok
}
const p = new People();
class Man {
constructor() {
fol = 1; // ReferenceError: fol is not defined
}
}
const m = new Man();
•class
的所有方法(包括静态方法和实例方法)是不可枚举
// 引用一个未声明的变量
function People() {
this.bar = 1;
}
People.say = function() {
return 1;
};
People.prototype.eat = function() {
// ...
};
const pKeys = Object.keys(Bar); // ['say']
const pProtoKeys = Object.keys(Bar.prototype); // ['eat']
class Man {
constructor() {
this.foo = 1;
}
static say() {
return 1;
}
eat() {
// ...
}
}
const mKeys = Object.keys(Man); // []
const mProtoKeys = Object.keys(Man.prototype); // []
•class
的所有方法(包括静态方法和实例方法)都没有原型对象 prototype,所以也没有[[construct]]
,不能使用 new
来调用。
function People() {
this.bar = 1;
}
People.prototype.print = function() {
console.log(this.bar);
};
const p = new People();
const pPrint = new bar.print(); // it's ok
class Man {
constructor() {
this.foo = 42;
}
print() {
console.log(this.foo);
}
}
const m = new Man();
const mPrint = new m.print(); // TypeError: foo.print is not a constructor
•必须使用 new
调用 class
。
function People() {
this.bar = 1;
}
const p = People(); // it's ok
class Man {
constructor() {
this.foo = 1;
}
}
const m = Man(); // TypeError: Class constructor Foo cannot be invoked without 'new'
•class
内部无法重写类名。
function People() {
People = 'Pap'; // it's ok
this.bar = 1;
}
const p = new People();
// People: 'Pap'
// bar: People {bar: 1}
class Man {
constructor() {
this.foo = 42;
Man = 'Woman'; // TypeError: Assignment to constant variable
}
}
const m = new Man();
Man = 'Fol'; // it's ok
References
[1]
999. 车的可用捕获量: https://leetcode-cn.com/problems/available-captures-for-rook/
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Flutter 专题】102 何为 Flutter RenderObjects ?
- 创建出来的maven项目没有iml文件
- SpringMVC传递参数乱码解决,web.xml中配置编码过滤器
- SpringMVC中传值有些值为null使用@RequestParam(“name“)解决
- 9.30面试:AOP+事务+JDK动态代理与cglib区别+Spring的aop如何切换底层创建代理对象的方式
- R语言实现基因组的可视化
- Linux实用命令大全(附思维导图)
- 二叉搜索树与python中self参数理解
- 需要了解的Python编码解码知识
- 程序员必备技能之markdown写作
- Python列表操作最全面总结
- Python 0基础开发游戏:打地鼠(详细教程)VS code版本
- Python经典编程题:字符串替换
- Python字典操作总结
- 纯代码系列:Python实现验证码图片(PIL库经典用法用法,爬虫12306思路)