下载 App
程序员模拟器不完整普通攻略
修改于51 分钟前380 浏览攻略
1.质数
引入算法效率概念,利用数学性质(平方根)优化验证范围
通过从2到其平方根的试除来验证,一旦发现可整除的数则立即中断,以此高效判断质数
limit:是Math.sqrt(n)(n 的平方根)的计算结果,它是一个临时变量,用来存储我们循环检查的上限值
Math.sqrt(n):JavaScript内置的数学函数,用于计算一个数 n 的平方根

2.上楼梯
next:一个临时变量,在动态规划的滑动窗口更新中充当 “中转站” ,用于安全地存储新计算出的结果,防止在更新其他状态变量时丢失数据

3.最大公约数
gcd:最大公约数 的英文缩写,全称为 Greatest Common Divisor
欧几里得算法公式:gcd(a, b) = gcd(b, a mod b)
通用公式:
gcd(a, b) = gcd(b, a)
= gcd(|a|, |b|)
= gcd(a, b mod a) // 如果a≠0
Math.abs() :JavaScript 中的一个内置数学函数,用于返回一个数字的绝对值
Math:JavaScript 的内置数学对象,包含各种数学函数和常量
abs:"absolute"(绝对值)的缩写
欧几里得算法:或称辗转相除法,是计算两个正整数最大公约数的高效算法

4.最小公倍数
lcm:最小公倍数的英文缩写,全称为Least Common Multiple
公式:lcm = a × b ÷ gcd(a, b)

5.斐波那契数列
递推公式:F(n) = F(n-1) + F(n-2)
比内公式:F(n) = (φ^n - (-φ)^(-n)) / √5
prev和curr是在迭代计算斐波那契数列时使用的两个关键变量
prev:代表前一个斐波那契数 即F(n-2)
curr:代表当前斐波那契数 即F(n-1)

6.数字根
digital root:把一个大数字"压缩"成一个0-9的个位数,是数学中的简化工具,也是编程中的实用函数
1. 把数字拆成各位数字
2. 将所有数字相加得到和
3. 如果和≥10,重复步骤1-2
4. 直到得到个位数

7.最大值
findMax:"找最大值"的函数,输入一堆数字,输出其中最大的那个

8.和
sum:求和、总和
Array:数组
sumArray:求数组元素的和
total:总计、总和
i:index的缩写,表示索引、下标
arr:array的缩写,数组
length:长度
arr.length:数组的长度(元素个数)
function sumArray(arr) {
let total = 0
let i = 0
while (i < arr.length) {
total = total + arr[i]
i = i + 1
}
return total
}
return sumArray(输入)
9.罗马数字
romanToInt:罗马转整数的函数
romanMap:字符到数值的映射表
currentVal/nextVal:用于实现减法规则
int:integer(整数)的缩写
Roman:罗马、罗马数字
intToRoman:整数转罗马数字的函数
values:数值数组
symbols:符号数组
result:结果字符串
function r(s){
let sum=0
let i=0
while(i<s.length){
let c=s[i]
let v=0
if(c=='I')v=1
if(c=='V')v=5
if(c=='X')v=10
if(c=='L')v=50
if(c=='C')v=100
if(c=='D')v=500
if(c=='M')v=1000
let nv=0
if(i+1<s.length){
let nc=s[i+1]
if(nc=='I')nv=1
if(nc=='V')nv=5
if(nc=='X')nv=10
if(nc=='L')nv=50
if(nc=='C')nv=100
if(nc=='D')nv=500
if(nc=='M')nv=1000
}
if(v<nv){
sum=sum+nv-v
i=i+2
}else{
sum=sum+v
i=i+1
}
}
return sum
}
return r(输入)
10.有效括号
stack(栈):后进先出,像一摞盘子
push(压入):往栈顶加元素
pop(弹出):从栈顶取元素
top(栈顶):最后一个放入的元素
empty stack(空栈):栈里没东西
match(匹配):左右括号是同一对
遇到左括号 ( [ { → 放进盒子(放在最上面)
遇到右括号 ) ] } → 从盒子最上面拿出一个,看看是不是一对
是 → 继续
不是 → 失败
如果盒子里没东西了(空)却来了右括号 → 失败
最后,盒子必须是空的 → 成功
function f(s){
let stack=[]
let i=0
while (i<s.length ){
let c=s[i]
if (c==='('||c==='['||c==='{' ){
stack.push(c)
}else {
if (stack.length===0 ){
return false
}
let top=stack.pop()
if (c===')'&&top!=='(' )return false
if (c===']'&&top!=='[' )return false
if (c==='}'&&top!=='{' )return false
}
i=i+1
}
return stack.length===0
}
return f(输入)
11.合并有序数组
sorted(有序):数组里的数字按从小到大(或从大到小)排列,比如 [1, 3, 5] 就是有序的
merge(合并):把两个东西合在一起
这里就是把两个数组拼成一个
two pointers(双指针):用两个“手指”分别指着两个数组当前要比较的位置
谁小就把谁放进结果里,然后移动对应的手指
pointer(指针):数组的索引,表示当前读到哪个位置了
function m(a, b) {
let r = []
let i = 0
let j = 0
while (i < a.length && j < b.length) {
if (a[i] < b[j]) {
r.push(a[i])
i = i + 1
} else {
r.push(b[j])
j = j + 1
}
}
while (i < a.length) {
r.push(a[i])
i = i + 1
}
while (j < b.length) {
r.push(b[j])
j = j + 1
}
return r
}
return m(输入[0], 输入[1])
12.岛屿数量
网格(grid):二维数组,每个格子存一个字符 '1' 或 '0'。
岛屿(island):上下左右连成一片的 '1' 组成的区域。
深度优先搜索(DFS):从某个 '1' 开始,一路向四个方向走到底,把所有能走到的 '1' 都标记为已访问,这样就能找到一个完整的岛屿。
标记(mark):把走过的 '1' 变成 '0',防止重复计算。
相邻(adjacent):上下左右四个方向,不算对角线。
遍历地图 → 遇1则计数 → 淹掉整个岛 → 继续遍历 → 完事
function n(grid) {
if (!grid || grid.length === 0) return 0
let rows = grid.length
let cols = grid[0].length
let count = 0
let i = 0
while (i < rows) {
let j = 0
while (j < cols) {
if (grid[i][j] == 1) {
count = count + 1
dfs(i, j)
}
j = j + 1
}
i = i + 1
}
function dfs(r, c) {
if (r < 0 || r >= rows || c < 0 || c >= cols || grid[r][c] != 1) return
grid[r][c] = 0
dfs(r - 1, c)
dfs(r + 1, c)
dfs(r, c - 1)
dfs(r, c + 1)
}
return count
}
return n(输入)
13.两数之和
目标值(target):要找的两个数加起来等于的那个数
哈希表(hash table):一种用键值对存储数据的数据结构,可以快速查找某个值是否存在
在JavaScript 里可以用普通对象 {} 或 Map 模拟
下标(index):数组元素的位置,从 0 开始数
暴力枚举(brute force):把所有可能的两数组合都试一遍,找出符合条件的
变量a=输入[0]
变量b=输入[1]
变量c=0
while (变量c<变量a.length ){
变量d=变量c+1
while (变量d<变量a.length ){
if (变量a[变量c]+变量a[变量d]==变量b){
return [变量c,变量d]
}
变量d=变量d+1
}
变量c=变量c+1
}
return [-1,-1]













