算法题小记
一些算法题刷题记录
Jiangxin829
前端小菜鸡
展开
-
01背包问题
题目一共有N件物品,第i(i从1开始)件物品的重量为weights[i],价值为values[i]。在总重量不超过背包承载上限size的情况下,能够装入背包的最大价值是多少?思路dp[i][j]代表前i个物品在容量j背包下的最大价值1.第i个物品无法放下dp[i][j] = dp[i - 1][j] // 前i-1个物品在j容量下的dp2.可以放下a.放下了dp[i][j] = dp[i - 1][j - weights[i]] + values[i] // 前i-1个物品在j-weig原创 2021-08-20 17:33:32 · 66 阅读 · 0 评论 -
LeetCode416. 分割等和子集
题目:思路背包问题:有一个容量为 V 的背包,和一些物品。这些物品分别有两个属性,体积 w 和价值 v,每种物品只有一个。要求用这个背包装下价值尽可能多的物品,求该最大价值,背包可以不被装满。本题是简单的背包问题,只需要考虑将物品分成两个背包,使价值相等,无体积限制。具体每个步骤看代码注释,写的很清楚~提交 /** * @param {number[]} nums * @return {boolean} */ var canPartition = function(nu原创 2021-08-19 10:53:03 · 53 阅读 · 0 评论 -
HJ108 求最小公倍数
题目:思路:公共除数之积 * 各自余数之积提交:let linewhile ((line = readline())) { let arr = line.trim().split(' ') let a = Number(arr[0]) let b = Number(arr[1]) let t = 1 let length = a < b ? a + 1 : b + 1 for (let i = 2; i < length; i++) {原创 2021-08-17 16:34:00 · 157 阅读 · 0 评论 -
HJ103 Redraiment的走法(梅花桩走法DP)
题目:思路:不论从哪开始走,第一步值为1dp = [1]针对一根桩子,往前看,第i根桩子的步数必然是前面比它矮的最近一根的步数 + 1状态转移方程:当arr[i] > arr[i - 1]时,必然有dp[i] = dp[i - 1] + 1提交:let lengthwhile (length = Number(readline())) { let arr = readline().trim().split(' ').map(item => Number(item))原创 2021-08-17 16:33:43 · 611 阅读 · 0 评论 -
HJ102 字符统计(先按出现次数排序,再按ASCII码排序)
题目:思路:先生成字典以字典对应值的次数作为数组index将相同次数的值放一块并排序倒叙输出数组提交:let linewhile (line = readline()) { let length = line.length let obj = {} for (let i = 0; i < length; i++) { if (obj[line[i]]) { obj[line[i]]++ } else {原创 2021-08-17 16:33:18 · 169 阅读 · 0 评论 -
HJ99 自守数
题目:思路:讨论区看到的,变量base取余(i * i % base === i)就用的很巧妙,学习一下提交:let linewhile (line = Number(readline())) { let base = 10 let count = 0 for (let i = 0; i <= line; i++) { if (i === base) { base *= 10 } if (i原创 2021-08-17 16:32:55 · 149 阅读 · 0 评论 -
HJ94 记票统计
题目:思路:先按候选人生成字典并给初始值后输入的取字典里找,找不到就是不合格的票找到了字典+1提交:let linewhile(line = Number(readline())) { let persons = {} readline().trim().split(' ').forEach(item => { persons[item] = 0 }) let line2 = Number(readline()) let inva原创 2021-08-17 16:32:37 · 116 阅读 · 0 评论 -
HJ93 数组分组(递归,DFS)
题目:思路:现在需要让arr3和arr5两个数组中的和相等,就需要将other数组中的数分配到两个数组中,假设分配x到arr5中,分配y到arr3数组中,那么需要满足如下关系式。需要满足公式:1:sum5 + x = sum3 + y2:x + y = othersum转换得到:1:sum5 - sum3 = y - x2:other = x + y两个公式相加:sum5 - sum3 + other = 2*y进一步可以推出:y = (sum5 - sum3 + othe原创 2021-08-16 15:21:46 · 317 阅读 · 0 评论 -
HJ91 走方格的方案数
题目:思路:状态转移方程:f(x, y) = f(x-1, y) + f(x, y-1)let linewhile(line = readline()) { let arr = line.split(' ').map(item => Number(item)) let dp = [] for (let i = 0; i <= arr[0]; i++) { dp[i] = [] for (let j = 0; j <= arr原创 2021-08-16 15:21:29 · 380 阅读 · 0 评论 -
HJ71 字符串通配符
题目:思路:有意思的地方在于利用RegExp构造函数生成我们的新正则提交:let linewhile(line = readline()) { let str = readline() let exp = line.replace(/\./g, '\.') .replace(/\*/g, '[a-zA-Z0-9\.]*') .replace(/\?/g, '[a-zA-Z0-9\.]*')// console.log(1, exp) let r原创 2021-08-16 15:20:35 · 367 阅读 · 0 评论 -
HJ68 成绩排序
题目:思路:难点在于排序后相同分数要按输入顺序输出自己手写一个排序方法,每次找到第一个最小/大的,存起来,再将剩余的继续排序(递归)提交:while(line = Number(readline())) { let isFromLowToHeight = Number(readline()) let grades = [] for (let i = 0; i < line; i++) { grades.push(readline().trim().原创 2021-08-16 15:20:20 · 358 阅读 · 0 评论 -
HJ64 MP3光标位置
题目:let totalNumwhile(totalNum = Number(readline())) { let optArr = readline().trim().split('') let currentIndex = 1 let screenHeight = totalNum < 4 ? totalNum : 4 let screenStart = currentIndex let screenEnd = screenStart + scree原创 2021-08-16 15:20:05 · 149 阅读 · 0 评论 -
HJ63 DNA序列
题目:思路:遍历,每次取相应长度的字串并计算比值,如果为1立即退出提交:while(line = readline()) { let totalLength = line.length let subLength = Number(readline()) let subStrObj = {} let maxGCTimes = 0 let maxGCStr = '' for(let i = 0; i < totalLength; i ++) {原创 2021-08-16 15:19:50 · 199 阅读 · 0 评论 -
HJ61 放苹果
题目:思路:状态方程:m为苹果数量,n为盘子数量针对盘子,是否有一个为空可发现:dp(m,n)=dp(m, n -1) + dp(m - n, n) // 第n个盘子是否为空+各个盘子均放了一个提交:while(line = readline()) { let arr = line.split(' ').map(item => parseInt(item)) // m为苹果数量 n为盘子数量 function dp(m, n) { // 苹果不原创 2021-08-16 15:19:23 · 115 阅读 · 0 评论 -
HJ60 查找组成一个偶数最接近的两个素数
题目:思路:循环2-num/2,分别检验每个item及(num-item)是否是素数,再在循环中找最小差值提交:while(line = Number(readline())) { // 先求出素数列表 let list = [] function isPrime(value) { if (value <= 2.) return true let flag = true for (let i = 2; i <= M原创 2021-08-16 15:19:02 · 169 阅读 · 0 评论 -
HJ59 找出字符串中第一个只出现一次的字符
题目:思路:将输入字符串生成字典,再找次数最小的提交:while(line = readline()) { let obj = {} for (let i = 0; i < line.length; i++) { if(obj[line[i]]) { obj[line[i]].push(line[i]) } else { obj[line[i]] = [line[i]] }原创 2021-08-16 15:18:47 · 129 阅读 · 0 评论 -
HJ53 杨辉三角的变形
题目:提交:while(line = Number(readline())) { let arr = new Array(line) for (let i = 0; i < line; i ++) { arr[i] = [] if (i === 0) { arr[0][line - 1] = 1// console.log(arr[i]) continue }原创 2021-08-16 15:18:28 · 216 阅读 · 0 评论 -
HJ52 计算字符串的距离(编辑距离)
题目:思路:lev[i][j]用来表示字符串a的[1…i]和字符串b[1…j]的levenshtein距离;插入和删除操作互为逆过程:a删除指定字符变b等同于b插入指定字符变a;如果a[i] == b[j],则说明a[i]和b[j]分别加入a,b之后不会影响levenshtein距离,lev[i][j] = lev[i-1][j-1] + 0;如果a[i] != b[j],则需要考虑3种情况的可能:a中插入字符b[j],只需计算当前1步 + a的[1…i - 1]与b[1…j]的levensh原创 2021-08-15 10:31:37 · 447 阅读 · 0 评论 -
HJ43 迷宫问题
题目:分四个方向分别递归,递归结束的条件就是走到最后一个,存储min(当前路径,已存路径)提交:while ((line = readline())) { const arr = line.split(' ').map(item => Number(item)) const rowNum = arr[0] const columnNum = arr[1] const maze = [] for (let i = 0; i < rowNum; i+原创 2021-08-15 10:31:08 · 250 阅读 · 0 评论 -
HJ41 称砝码
题目:思路:简单的组合问题,循环遍历每一项,与现有的组合,遍历组合成新的数组,将结果加入现有组合提交:while(line = readline()) { const num = Number(line) const weights = readline().split(' ').map(item => Number(item)) const nums = readline().split(' ').map(item => Number(item)) let原创 2021-08-15 10:30:56 · 183 阅读 · 0 评论 -
HJ37 统计每个月兔子的总数
题目:思路:1 2 3 4 51 1 2 3 5斐波那契数列dp[i] = dp[i - 1] + dp[i - 2]提交:while(line = Number(readline())) {// 递归// function getCurrentMonthNum(month) {// if (month <= 2) {// return 1// } else {/原创 2021-08-15 10:30:44 · 103 阅读 · 0 评论 -
HJ35 蛇形矩阵
题目:思路:arr[i][j] = arr[i][j - 1] + j + 1 + i找到规律即可提交:while(line = readline()) { let arr = new Array(Number(line)).fill([]) for(let i = 0; i < Number(line); i++) { arr[i] = new Array(Number(line)).fill('') if (i === 0) {原创 2021-08-15 10:30:26 · 118 阅读 · 0 评论 -
HJ30 字符串合并处理
题目:思路:注意进制转换Number(‘0x’ + newStr[i]).toString(2)Number(‘0b’ + reverseValue).toString(16)提交:while(line = readline()) { let str = line.replace(/\s/g, '') let str1 = '', str2 = '' for(let i = 0; i < str.length; i++) { if(i % 2 ==原创 2021-08-15 10:29:43 · 116 阅读 · 0 评论 -
HJ26 字符串排序
题目:思路:将字母提出来生成排序后的字符串遍历原字符串找到所有字母并逐一替换提交:while(line = readline()) { let arr = new Array(26).fill('') line.split('').forEach(item => { if (/[a-zA-Z]/.test(item)) { arr[item.toLowerCase().charCodeAt(0) - 97] += item原创 2021-08-15 10:29:15 · 125 阅读 · 0 评论 -
HJ22 汽水瓶
题目:提交:function filter(total) { let a = Math.floor(total / 3) let b = total % 3 if ((a + b)> 3) { return a + filter(a + b) } else if ((a + b) > 1) { return a + 1 } else { return a }} while(line = r原创 2021-08-15 10:28:49 · 118 阅读 · 0 评论 -
HJ20 密码验证合格程序
题目:提交:while(line = readline()) { if (line.length <= 8) { console.log('NG') continue } let hasNoRepeat = true for(let i = 0; i <= line.length - 3; i++) { if(line.slice(i + 1).indexOf(line.slice(i, i + 3)) >原创 2021-08-15 10:28:07 · 127 阅读 · 0 评论 -
HJ27 查找兄弟单词
题目:思路:并不需要先列出所有的兄弟单词给了6个单词就把每个单词打散排序作为字典key,这样就筛选出来比如:{abc: 【xxx,xxx】ac:【xx, xx】}只需要将关键的单词作为key,在对象中找到并按要求输出即可,不需要他自己提交:while(line = readline()) { const [num, ...rest] = line.split(' ') const wordsLength = Number(num) const words = r原创 2021-08-15 10:29:30 · 210 阅读 · 0 评论 -
HJ17 坐标移动
题目:提交:let line = readline()const position = [0, 0]line.split(';').forEach(item => { if (/^[AWSD]{1}[1-9]{1}[0-9]*$/.test(item)) { switch(item[0]) { case 'A': position[0] -= Number(item.slice(1))原创 2021-08-13 15:57:31 · 226 阅读 · 0 评论 -
HJ10 字符个数统计
题目:提交:let line = readline()let result = ''for (let i = 0; i <= line.length - 1; i++) { if (result.indexOf(line[i]) < 0) { result += line[i] }}console.log(result.length)原创 2021-08-13 15:53:21 · 137 阅读 · 0 评论 -
HJ9 提取不重复的整数
题目:提交:let line = readline()let result = ''for (let i = line.length - 1; i >= 0; i--) { if (result.indexOf(line[i]) < 0) { result += line[i] }}console.log(result)原创 2021-08-13 15:49:23 · 61 阅读 · 0 评论 -
HJ8 合并表记录
题目:提交:const number = readline()const result = {}for(let i = 0; i < Number(number); i++) { let line = readline() let arr = line.split(' ') if (result[arr[0]]) { result[arr[0]] = Number(result[arr[0]]) + Number(arr[1]) } else原创 2021-08-13 15:48:15 · 78 阅读 · 0 评论 -
HJ6 质数因子
题目:提交:let line = readline()function getPrimeNumber(value) { if (value === 1) return [1] const maxNum = Math.ceil(Math.sqrt(value)) const result = [] let flag = false for (let i = 2; i <= maxNum; i++) { if (value % i === 0原创 2021-08-13 15:44:59 · 84 阅读 · 0 评论 -
HJ5 进制转换
题目:提交:while(line = readline()) { console.log(Number(line).toString(10))}原创 2021-08-13 15:42:42 · 137 阅读 · 0 评论 -
HJ4 字符串分隔
题目:while(line = readline()) { for(let i = 0; i < Math.ceil(line.length/8); i++) { let endIndex = (i + 1) * 8 > line.length ? line.length : (i + 1) * 8 let str = line.slice(i * 8, endIndex) console.log((str + '0000000').s原创 2021-08-13 15:39:34 · 73 阅读 · 0 评论 -
HJ3 明明的随机数
题目:提交:while(NN = readline()) { let arr = [] for(let i = 0; i < NN; i++) { arr.push(readline()) } let newSet = new Set([...arr]) arr = [...newSet] arr.sort((a, b) => { return a-b }) arr.forEach(item原创 2021-08-13 15:36:34 · 298 阅读 · 0 评论 -
HJ2 计算某字母出现次数
题目:提交:let str = readline()let key = readline()let reg = new RegExp(key, 'ig')let result = str.match(reg)console.log(result ? result.length : 0)原创 2021-08-13 15:33:54 · 69 阅读 · 0 评论 -
HJ1 字符串最后一个单词的长度
题目:提交:let str = readline()str = str.replace(/\W+/g, '-')// console.log(str)function getLastWordLength (str) { const arr = str.split('-'); const lastIndex = arr.length - 1; return arr[lastIndex].length || arr[lastIndex - 1].length ;}cons原创 2021-08-13 15:31:40 · 82 阅读 · 0 评论