通州网站网站建设/新手怎么学网络运营
各类题的解决方案
话不多说,系统整理下解题的一些算法和解决方案
二叉树
二叉树大多使用递归的方式左右两个元素向下递归。比如:
计算二叉树最大深度
var maxDepth = function (root) {if (root == null) return 0return 1 + Math.max(maxDepth(root.left), maxDepth(root.right))
};
将二叉树以二维数组形式表现
var levelOrder = function(root) {let ans = []helper(root, ans, 0)return ans
};function helper(node, ans, i){if (node == null) returnif (i == ans.length) ans.push([])ans[i].push(node.val)helper(node.left, ans, i + 1)helper(node.right, ans, i + 1)
}
都是通过递归方式逐层向下去查找二叉树数据。
可能性问题
这类题一般是告诉你一组数据,然后求出可能性、最小值或最大值。比如:
给定几种面额的硬币和一个总额,使用最少的硬币凑成这个总额。
var coinChange = function (coins, amount) {let max = amount + 1let dp = new Array(amount + 1)dp.fill(max)dp[0] = 0for (let i = 1; i < max; i++) {for (let j = 0; j < coins.length; j++) {if (coins[j] <= i) {dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1)}}}return dp[amount] > amount ? -1 : dp[amount]
};
使用了动态规划(DP),将从 0 到目标额度所需的最小硬币数都列出来。
求出从矩阵左上角走到右下角,且只能向右向下移动,一共有多少种可能性。
var uniquePaths = function (m, n) {const pos = new Array(m)for (let i = 0; i < m; i++) {pos[i] = new Array(n)}for (let i = 0; i < n; i++) {pos[0][i] = 1}for (let i = 0; i < m; i++) {pos[i][0] = 1}for (let i = 1; i < m; i++) {for (let j = 1; j < n; j++) {pos[i][j] = pos[i - 1][j] + pos[i][j - 1]}}return pos[m - 1][n - 1]
};
这题就是使用了动态规划逐步列出每一格的可能性,最后返回右下角的可能性。
获取给定数组连续元素累加最大值
var maxSubArray = function (nums) {let count = nums[0], maxCount = nums[0]for (let i = 1; i < nums.length; i++) {count = Math.max(count + nums[i], nums[i])maxCount = Math.max(maxCount, count) }return maxCount
};
上面这题通过不断对比最大值来保留并返回最大值。
其实,可能性问题使用动态规划要比使用 DFS、BFS 算法更加简单而容易理解。(我使用 DFS 经常报 TLE)
查找
一般遇到的查找问题,如查找某个值一般会用到一下方法:
- 排序算法(排序便于查找)
- 二分查找
- 索引移动查找(这个方法名自己想的,大概就这个意思~)
查找横向和纵向都递增的二维矩阵中的某个值
var searchMatrix = function (matrix, target) {if (matrix.length == 0) return falselet row = 0, col = matrix[0].length - 1while (true) {if (matrix[row][col] > target && col > 0) {col--} else if (matrix[row][col] < target && row < matrix.length - 1) {row++} else if (matrix[row][col] == target) {return true} else {break}}return false
};
先将位置定位在右上角,通过改变位置坐标来找到目标值。使用了索引移动查找法来找到结果。
找到数组中最左边和最右边的某个数字所在位置
var searchRange = function (nums, target) {let targetIndex = binarySearch(nums, target, 0, nums.length - 1)if (targetIndex == -1) return [-1, -1]let l = targetIndex, r = targetIndexwhile(l > 0 && nums[l - 1] == target){l--}while(r < nums.length - 1 && nums[r + 1] == target){r++}return [l, r]
};function binarySearch(arr, val, lo, hi) {if (hi < lo) return -1let mid = lo + parseInt((hi - lo) / 2)if (val < arr[mid]) {return binarySearch(arr, val, lo, mid - 1)} else if (val > arr[mid]) {return binarySearch(arr, val, mid + 1, hi)} else {return mid}
}
参考视频:传送门
这题使用二分法来查找到某个目标数字的索引值,然后索引移动法分别向左和向右查找字符。获取左右两侧的索引值返回。
回文
所谓回文,就是正着读反着读是一样的。使用索引两边向中间移动的方式来判断是否为回文。
找到给定字符串中某段最长的回文
var longestPalindrome = function (s) {let maxLength = 0, left = 0, right = 0for (let i = 0; i < s.length; i++) {let singleCharLength = getPalLenByCenterChar(s, i, i)let doubleCharLength = getPalLenByCenterChar(s, i, i + 1)let max = Math.max(singleCharLength, doubleCharLength)if (max > maxLength) {maxLength = maxleft = i - parseInt((max - 1) / 2)right = i + parseInt(max / 2)}}return s.slice(left, right + 1)
};function getPalLenByCenterChar(s, left, right) {// 中间值为两个字符,确保两个字符相等if (s[left] != s[right]){return right - left}while (left > 0 && right < s.length - 1) {left--right++if (s[left] != s[right]){return right - left - 1}}return right - left + 1
}
路径题
路径题可以使用深度优先(DFS)和广度优先(BFS)算法来做。我比较常用的是使用 DFS 来做。通过递归将走过的路径进行标记来不断往前找到目标路径。如:
通过给定单词在二维字母数组中查找是否能使用邻近字母组成这个单词(212题)
let hasWord = falsevar findWords = function (board, words) {var ans = []for (let word of words) {for (let j = 0; j < board.length; j++) {for (let i = 0; i < board[0].length; i++) {if (board[j][i] == word[0]) {hasWord = falseDFS(word, board, 0, j, i, "")if (hasWord) {if (!ans.includes(word))ans.push(word)}}}}}return ans
};function DFS(word, board, index, j, i, subStr) {if (word[index] == board[j][i]) {subStr += board[j][i]board[j][i] = "*"if (j < board.length - 1)DFS(word, board, index + 1, j + 1, i, subStr)if (j > 0)DFS(word, board, index + 1, j - 1, i, subStr)if (i < board[0].length - 1)DFS(word, board, index + 1, j, i + 1, subStr)if (i > 0)DFS(word, board, index + 1, j, i - 1, subStr)board[j][i] = word[index]}if (index >= word.length || subStr == word) {hasWord = true}
}
由于 DFS 是一条路走到黑,如果每个元素都去使用 DFS 来找会出现超时的情况。如果条件允许(如查找递增数组)可以通过设置缓存来优化 DFS 查找超时问题。
获取二维矩阵中最大相邻递增数组长度。
const dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]]var longestIncreasingPath = function (matrix) {if (matrix.length == 0) return 0const m = matrix.length, n = matrix[0].lengthlet max = 1let cache = new Array(m)for (let i = 0; i < m; i++){let child = new Array(n)child.fill(0)cache[i] = child}for (let i = 0; i < m; i++) {for (let j = 0; j < n; j++) {let len = dfs(matrix, i, j, m, n, cache)max = Math.max(max, len)}}return max
}function dfs(matrix, i, j, m, n, cache){if (cache[i][j] != 0) return cache[i][j]let max = 1for (let dir of dirs){let x = i + dir[0], y = j + dir[1]if(x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] <= matrix[i][j]) continue;let len = 1 + dfs(matrix, x, y, m, n, cache)max = Math.max(max, len)}cache[i][j] = maxreturn max
}
将已使用 DFS 查找过的长度放入缓存,如果有其他元素走 DFS 走到当前值,直接返回缓存最大值即可。
链表
链表从 JS 的角度来说就是一串对象使用指针连接的数据结构。合理使用 next
指针改变指向来完成对链表的一系列操作。如:
链表的排序:
var sortList = function (head) {if (head == null || head.next == null) return headlet prev = null, slow = head, fast = headwhile (fast != null && fast.next != null) {prev = slowslow = slow.nextfast = fast.next.next}prev.next = null;let l1 = sortList(head)let l2 = sortList(slow)return merge(l1, l2)
};function merge(l1, l2) {let l = new ListNode(0), p = l;while (l1 != null && l2 != null) {if (l1.val < l2.val) {p.next = l1;l1 = l1.next;} else {p.next = l2;l2 = l2.next;}p = p.next;}if (l1 != null)p.next = l1;if (l2 != null)p.next = l2;return l.next;
}
使用了自上而下的归并排序方法对链表进行了排序。使用 slow.next
和 fast.next.next
两种速度获取链表节点,从而获取中间值。
链表的倒序
var reverseList = function(head) {let ans = null,cur = headwhile (cur != null) {let nextTmp = cur.nextcur.next = ansans = curcur = nextTmp}return ans
};
排序
排序和查找算是算法中最重要的问题了。常用的排序算法有:
- 插入排序
- 选择排序
- 快速排序
- 归并排序
- 计数排序
更多排序算法的知识点可参考《JS家的排序算法》,文章作者图文并茂的讲解了各种排序算法,很容易理解。
举几个排序算法的栗子:
求数组中第K大的值
/*** @param {number[]} nums* @param {number} k* @return {number}*/
var findKthLargest = function (nums, k) {for (let i = 0; i <= k; i++) {let max = ifor (let j = i; j < nums.length; j++) {if (nums[j] > nums[max]) max = j}swap(nums, i, max)}return nums[k - 1]
};function swap(arr, a, b) {let tmp = arr[a]arr[a] = arr[b]arr[b] = tmp
}
使用了选择排序排列了前 K 个值得到结果。
对有重复值的数组 [2,0,2,1,1,0]
排序
var sortColors = function (nums) {sort(nums, 0, nums.length - 1)
};function sort(arr, lo, hi) {if (hi <= lo) returnlet lt = lo, i = lo + 1, gt = hi;let v = arr[lo]while (i <= gt) {if (arr[i] < v) swap(arr, lt++, i++)else if (arr[i] > v) swap(arr, i, gt--)else i++}sort(arr, lo, lt - 1)sort(arr, gt + 1, hi)
}function swap(arr, a, b) {let x = arr[a]arr[a] = arr[b]arr[b] = x
}
这种有重复值的使用三向切分的快速排序是非常好的解决方案。当然,计数排序法可是不错的选择。
还有之前提到的链表的排序使用的是归并排序。
算术题
算术题看似简单,但是遇到最大的问题就是:如果使用累加、累成这种常熟级别的增长,遇到很大的数字会出现 TLE (超出时间限制)。所以,我们要用指数级别的增长来找到结果。如:
计算 x 的 n 次方
var myPow = function (x, n) {if (n == 0) return 1if (n < 0) {n = -nx = 1 / x}return (n % 2 == 0) ? myPow(x * x, parseInt(n / 2)) : x * myPow(x * x, parseInt(n / 2));
};
一开始我使用了 x*x 这么乘上 n 次,但是遇到 n 太大就直接超时了。使用以上方案:29 = 2 * 44 = 2 * 82 = 2 * 64 = 128
直接从常熟级变化变为指数级变化,这一点在数学运算中是需要注意的。
求 x 的平方根
var mySqrt = function (x) {let l = 0, r = xwhile (true) {let mid = parseInt(l + (r - l) / 2)if (mid * mid > x) {r = mid - 1} else if (mid * mid < x) {if ((mid + 1) * (mid + 1) > x) {return mid}l = mid + 1} else {return mid}}
};
这题使用二分法来找到结果。
二进制问题
二进制问题,一般使用按位运算符和二进制转换 Number.parseInt()
和 Number.prototype.toString()
来解决。
将一个32位数字的二进制进行倒序
var reverseBits = function(n) {var t = n.toString(2).split("");while(t.length < 32) t.unshift("0"); // 插入足够的 0return parseInt(t.reverse().join(""), 2);
};
常用算法
讲了这么多,其实除了常用的排序、搜索,其他最常用的就是 DP、DFS、BFS 这三个算法了。可以这么说:掌握了排序和这三个算法,可以 AC 大多数的算法问题。这么牛逼的算法了解一下?
简单说说几种排序和查找
- 冒泡排序:遍历数组,对比元素和后面相邻元素,如果当前元素大于后面元素,调换位置。这样从头遍历到尾,获取最后一位排序玩的元素。然后在 1 到 n - 1 中再次重复以上步骤。直到最后第一和第二个元素对比大小。是一种从后往前的排序。
- 选择排序:遍历数组,找到最小的元素位置,与第一个元素调换位置,然后缩小范围从第二个元素开始遍历,如此重复到最后一个元素。可以从后往前也可以从前往后排序。
function sort(arr) {const len = arr.lengthfor (let i = 0; i < len; i++) {let min = ifor (let j = i + 1; j < len; j++) {if (arr[j] < arr[min]) min = j}swap(arr, i, min)console.log(arr)}return arr
}
- 插入排序:遍历数组,选中某一个元素,与前面相邻元素对比,如果当前元素小于之前元素,调换位置,继续对比直到当前元素前的元素小于当前元素(或者到最前面),如此对所有元素排序一遍。是一种从前往后的排序。
function sort(arr) {const len = arr.lengthfor (let i = 1; i < len; i++) {for (let j = i; j > 0 && arr[j] < arr[j - 1]; j--) {swap(arr, j, j - 1)console.log(arr)}}return arr
}
- 希尔排序:类似于插入排序,选中一个元素与元素前 n 个元素进行比大小和调换位置。之后再缩小 n 的值。这种方法可以减少插入排序中最小值在最后面,然后需要一个一个调换位置知道最前面这类问题。减少调换次数。是一种从前往后的排序。
- 归并排序:在《算法》中提到了两种归并排序:一种是自上而下的归并排序。将数组不断二分到最小单位(1到2个元素)将他们进行排序,之后将前两个和后两个元素对比,如此往上最后完成整个数组的排序。还有一种自下而上的归并排序是直接将数组分割为若干个子数组进行排序然后合并。
let aux = new Array(arr.length)
function sort(arr, lo, hi) {if (hi <= lo) returnlet mid = lo + (parseInt((hi - lo) / 2))sort(arr, lo, mid)sort(arr, mid + 1, hi)merge(arr, lo, mid, hi)
}function merge(arr, lo, mid, hi) {let i = lo, j = mid + 1for (let k = lo; k <= hi; k++) {aux[k] = arr[k]}for (let k = lo; k <= hi; k++) {if (i > mid) arr[k] = aux[j++]else if (j > hi) arr[k] = aux[i++]else if (aux[j] < aux[i]) arr[k] = aux[j++]else arr[k] = aux[i++]}console.log(arr)
}
- 快速排序:选定第一个值为中间值,然后将小于中间值的元素放在中间值的左侧而大于中间值的元素放在中间值右侧,然后对两侧的元素分别再次切割,直到最小单位。
function sort(arr, lo, hi) {if (hi <= lo + 1) returnlet mid = partition(arr, lo, hi) // 切分方法sort(arr, lo, mid)sort(arr, mid + 1, hi)
}function partition(arr, lo, hi) {let i = lo, j = hi + 1let v = arr[lo]while(true) {while(arr[++i] < v) if (i == hi) breakwhile(v < arr[--j]) if (j == lo) breakif ((i >= j)) breakswap(arr, i, j)console.log(arr)}swap(arr, lo, j)console.log(arr)return j
}
- 三向切分的快速排序:类似于快速排序,优化点在于如果某个元素等于切分元素,元素位置不变。最后小于切分元素的到左边,等于切分元素的根据数量放在中间,大于切分元素的放在右边。适用于有大量相同大小元素的数组。
function sort(arr, lo, hi) {if (hi <= lo) returnlet lt = lo, i = lo + 1, gt = hi;let v = arr[lo]while (i <= gt) {if (arr[i] < v) swap(arr, lt++, i++)else if (arr[i] > v) swap(arr, i, gt--)else i++console.log(arr)}sort(arr, lo, lt - 1)sort(arr, gt + 1, hi)
}
- 堆排序:堆排序可以说是一种利用堆的概念来排序的选择排序。使用优先队列返回最大值的特性逐个返回当前堆的最大值。
- 计数排序:就是将数组中所有元素的出现次数保存在一个数组中,然后按照从小到大返回排序后的数组。
- 桶排序:其实就是字符串排序的 LSD 和 MSD 排序。LSD 使用索引计数法从字符串右边向左边移动,根据当前值进行排序。而 MSD 是从左到右使用索引计数法来排序,在字符串第一个字符后,将字符串数组分为若干个相同首字符串的数组各自进行第二、第三次的 MSD 排序。
- 二分查找: 对有序数组去中间值与目标值相比对。如果目标值小于中间值,取前一半数组继续二分。如果目标值大于中间值,取后一半数组继续二分。如果目标值等于中间值,命中!
DP
我的理解:动态规划就是下一状态可以根据上一状态,或之前几个状态获取到的一种推理过程。
DFS
深度优先搜索(DFS)就是选中某条从条件1到条件2的某条可能性进行搜索,之后返回搜索其他一条可能性,如此一条条升入。举个栗子,如果有5条路,那么 DFS 算法就是只排出一个斥候先走一条路走到底去侦察,如果走不通那么返回走下一条路径。
DFS(顶点v)
{标记v为已遍历;for(对于每一个邻接v且未标记遍历的点u)DFS(u);
}
DFS 使用的是递归的方式进行搜索的。
**示例:**在二维字母矩阵中查找是否能够使用相邻字母组成目标单词。
var exist = function (board, word) {for (let y = 0; y < board.length; y++) {for (let x = 0; x < board[0].length; x++) {if (find(board, word, y, x, 0)) return true}}return false
};function find(board, word, y, x, d) {if (d == word.length) return trueif (y < 0 || x < 0 || y == board.length || x == board[y].length) return false;if (board[y][x] != word[d]) return falselet tmp = board[y][x]board[y][x] = "*"let exist = find(board, word, y, x + 1, d + 1)|| find(board, word, y, x - 1, d + 1)|| find(board, word, y + 1, x, d + 1)|| find(board, word, y - 1, x, d + 1)board[y][x] = tmpreturn exist
}
BFS
广度优先搜索(BFS)就是将从条件1到条件2的所有可能性都列出来同步搜索的过程。适用于查找最短路径。举个栗子,如果有5条路,那么 BFS 算法就是分别向5条路排出斥候去侦察。
BFS()
{输入起始点;初始化所有顶点标记为未遍历;初始化一个队列queue并将起始点放入队列;while(queue不为空){从队列中删除一个顶点s并标记为已遍历; 将s邻接的所有还没遍历的点加入队列;}
}
BFS是使用数组存储下一顶点的方式。
**示例:**每次改变一次字母,通过给定数组中的单词,从单词 A 变为单词 B。(127题)
/** * @param {string} beginWord * @param {string} endWord * @param {string[]} wordList * @return {number} */
var ladderLength = function (beginWord, endWord, wordList) {if (!wordList.includes(endWord)) return 0let set = new Set(),visited = new Set(),len = 1set.add(beginWord)visited.add(beginWord)while (set.size != 0) {let tmp = new Set([...set])for (let w of tmp) {visited.add(w)set.delete(w)if (changeOneChar(w, endWord))return len + 1for (let word of wordList){if (changeOneChar(w, word) && !visited.has(word)){set.add(word)}}}len++}return 0
};function changeOneChar(a, b) {let count = 0for (let i = 0; i < a.length; i++)if (a[i] != b[i])count++return count == 1
}
最后
写下 AC 一遍题目之后的收获。
- 知道了方法论,做起题来轻松了不少。
- 遇到问题多找轮子,一定有某种方法论可以用。
- 不要耍小聪明用一些奇巧淫技,思路不对再怎么绕都是浪费时间。
- 不要想着自己造轮子(特别是算法方面),绝大多数问题前辈一定有更好更完善的方案在。自己造轮子费时费事又没太大意义。
- 看答案和自己做是两回事,自己动手实现了才能算是会了。
- 算法之所以存在,就是用来适应某些场景、解决某类问题的。在对的场景选择对的算法才能体现算法的价值,不要滥用算法。
- 没必要把所有算法都精通,但起码在遇到问题时可以找到最优算法解决问题。即知道算法的存在及其用途,按需深入学习。
其实刷算法题还是很有趣的事情,之后计划把 LeetCode 题库中的所有问题都刷一遍~
PS:本文以及相关项目中有任何错误或者可以改进的地方,还请提出。共同进步~
相关文章:

JavaScript刷LeetCode心得
各类题的解决方案 话不多说,系统整理下解题的一些算法和解决方案 二叉树 二叉树大多使用递归的方式左右两个元素向下递归。比如: 计算二叉树最大深度 var maxDepth function (root) {if (root null) return 0return 1 Math.max(maxDepth(root.le…...

浙江工商大学2023年硕士研究生 入学考试初试成绩查询通知及说明
根据往年的情况,2023浙江工商大学MBA考试初试成绩可能将于2月21日下午两点公布,为了广大考生可以及时查询到自己的分数,杭州达立易考教育为大家汇总了信息。一、成绩查询考生可以登录中国研究生招生信息网(http://yz.chsi.com.cn/…...

华为OD机试题 - 子序列长度(JavaScript)
最近更新的博客 华为OD机试题 - 任务总执行时长(JavaScript) 华为OD机试题 - 开放日活动(JavaScript) 华为OD机试 - 最近的点 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试题 - 最小步骤数(JavaScript) 华为OD机试题 - 任务混部(JavaScript) 华为OD机试题 - N 进…...

Simulink 自动代码生成电机控制:STM32 Encoder编码器使用总结
目录 Encoder 原理 STM32 Encoder 计数原理 模型仿真 模拟Encoder 基于Encoder计算角度和速度 关于启动的仿真 代码生成 运行演示 总结 总结一下基于STM32的Encoder接口的电机运行,相应的仿真和实验都是基于一个1024脉冲的增量式光电编码器,关于…...

《计算机系统基础》——计算机系统导论
文章目录《计算机系统基础》——计算机系统导论计算机的基本组成程序开发与执行过程机器语言汇编语言高级语言程序的转换处理程序的数据流动计算机系统层次结构早期计算机系统1GL2GL现代计算机系统3GL4GL指令集体系结构《计算机系统基础》——计算机系统导论 🚀接下…...

华为OD机试 - 获取最大软件版本号(JavaScript) | 机试题算法思路 【2023】
获取最大软件版本号 题目 Maven版本号定义,<主版本>.<次版本>.<增量版本>-<里程碑版本> 举例3.1.4-beta 其中,主版本和次版本都是必须的,主版本,次版本,增量版本由多位数字组成,可能包含前导零,里程碑版本由字符串组成。 <主版本>.<…...

python--pygame实现各级菜单栏目设置
随着学期的开始,同学们也即将进入计算机相关课程的课程设计了,对于python课程设计的小伙伴,可能有些是需要利用pygame来写应该小游戏的,因为最近很多小伙伴同学也在想我要一些基于python的pygame模块做的游戏项目,此外…...

C++Primer15.3节练习
练习15.11: debug定义如下所示: //基类 class Quote { public:Quote() default;Quote(const std::string& book,double sales_price):bookNo(book),price(sales_price){ }std::string isbn()const { return bookNo; }virtual double net_price(st…...

解决实际项目中stalled时间过久的问题
背景 在公司参与了一个做度量统计的项目,该项目的特点是页面上的表格、卡片、图标非常多。项目经常出现一种情况:页面加载速度较慢,开始怀疑是由于计算量较大,后端接口相应速度较慢。优化了一版后端接口后(加缓存、优…...

vim编辑器
目录 前言 1.下载安装vim 2.三种模式互换 3.vim配置 前言 vim是从 vi 发展出来的一个文本编译器。 代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 简单的来说, vi 是老式的字处理器,不过功能已经很齐全了&am…...

Python 使用 pip 安装 matplotlib 模块(秒解版)
长话短说:本人下载 matplotlib 花了大概三个半小时屡屡碰壁,险些暴走。为了不让新来的小伙伴走我的弯路,特意创作本片文章指明方向。 1.首先需要下载 python 我直接是在电脑自带的软件商店里下载的,图方便,当然在官网下…...

python-openCV—入门到精通系列讲解(配效果图)- 总览
前言: python-openCV是一种强大的计算机视觉库,可用于处理图像和视频等多媒体数据。它可以帮助您快速处理和分析图像和视频数据,并且在计算机视觉领域具有广泛的应用。在学习python-openCV时,一个速查手册是一个必不可少的工具。 你可以当本专栏当做一个速查手册,可以看…...

智能小车红外避障原理
红外避障电路红外避障电路由电位器R17,R28;发光二极管D8,D9;红外发射管 D2,D4和红外接收管D3,D5和芯片LM324等组成,LM234用于信号的比较,并产生比较结果输出给单片机进行处理。智能小车红外避障…...

(三十六)Vue解决Ajax跨域问题
文章目录环境准备vue的跨域问题vue跨域问题解决方案方式一方式二上一篇:(三十五)Vue之过渡与动画 环境准备 首先我们要借助axios发送Ajax,axios安装命令:npm i axios 其次准备两台服务器,这里使用node.j…...

【CSAPP】整数表示
文章目录整型数据类型无符号数的编码补码编码确定大小的整数类型练习1练习2有符号数和无符号数之间的转换练习C语言中的有符号数与无符号数练习扩展一个数字的位表示练习1练习2截断数字练习关于有符号数与无符号数的建议练习1练习2使用 位编码整数有两种不同的方式:…...

Python基础2
1. python函数定义 函数定义语法: def 函数名(传入参数): 函数体 return 返回值 —————————————— 参数如果不需要,可以省略返回值如果不需要,可以省略函数必须先定义在使用 注意ÿ…...

【项目立项管理】
项目立项管理 很杂,可以根据左边的列表查看自己不会的 。。。 立项管理主要是解决项目的组织战略符合性问题 开发所需的成本和资源属于经济可行性 承建方组织资源和项目的匹配程度 内部立项目的: 为项目进行资源分配,确定项目绩效目标&am…...

【验证码的识别】—— 极验验证码的识别
前言 (结尾有彩蛋欧) 目前,许多网站采取各种各样的措施来反爬虫,其中一个措施便是使用验证码。随着技术的发展,验证码的花样越来越多。验证码最初是几个数字组合的简单的图形验证码,后来加入了英文字母和混…...

华为OD机试 -旋转骰子(Python) | 机试题算法思路 【2023】
最近更新的博客 华为OD机试 - 卡片组成的最大数字(Python) | 机试题算法思路 华为OD机试 - 网上商城优惠活动(一)(Python) | 机试题算法思路 华为OD机试 - 统计匹配的二元组个数(Python) | 机试题算法思路 华为OD机试 - 找到它(Python) | 机试题算法思路 华为OD机试…...

C生万物 | 模拟实现库函数strcpy之梅开n度
文章目录【梅开一度】:观察库函数strcpy()的实现【梅开二度】:模仿实现strcpy()【梅开三度】:优化简练代码【梅开四度】:assert()断言拦截【梅开五度】:const修饰常量指针【梅开六度】:还可以有返回值哦&am…...

家庭理财,轻松记账修改收支记录这样操作
我们在记账的时候难免会出现记错或者想修改的地方,又或者是想将之前太久没有用的记账记录删除掉,今天,小编就教大家如何修改收支记录,一起接着往下看吧! 第一步,运行【晨曦记账本】在软件主界面中ÿ…...

河南工程学院2.17蓝桥杯培训
乘法口诀数列:https://www.acwing.com/problem/content/3466/ 剪绳子:https://www.acwing.com/problem/content/68Sin SinSine之舞:http://lx.lanqiao.cn/problem.page?gpidD5272 数列:https://www.acwing.com/problem/content/…...

【JavaSE】数据类型与变量
JAVA之父:詹姆斯高斯林 (James Gosling) 前言: 大家好,我是程序猿爱打拳。今天我给大家讲解的是Java基础中的数据类型。主要讲解的是各个类型的应用场景以及注意事项。 目录 1.数据类型 2.常量与变量 2.1常量 2.2变…...

生成模型技术发展过程
生成模型生成模型和判别模型的差异生成模型的目标是在给定了数据集D,并且假设这个数据集的底层分布(underlying distribution)是Pdata,我们希望够近似出这个数据分布。如果我们能够学习到一个好的生成模型,我们就能用这个生成模型为下游任务做…...

计算机网络第2章(物理层)学习笔记
❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得关注、点赞、收藏、…...

4564: 保留尾部*
描述规定输入的字符串中只包含字母和*号,除了尾部的*号之外,请将字符串中其他*号全部删除。输入输入数据包括一串字符串,只包含字母和*,总长度不超过80。输出输出按要求删除*后的字符串。样例输入*******A*BC*DEF*G****样例输出AB…...

安卓项目搭建grpc环境
本篇文章使用的IDE是Android Studio。这里先吐槽一句,安卓项目搭建grpc环境,不管是引入插件还是引入第三方库,对于版本的要求都极为苛刻,一旦版本不匹配就会报错,所以对于版本的搭配一定要注意。 下面介绍的这个版本搭…...

Flink01: 基本介绍
一、什么是Flink 1. Flink是一个开源的分布式,高性能,高可用,准确的流处理框架 (1)分布式:表示flink程序可以运行在很多台机器上, (2)高性能:表示Flink处理性…...

设计模式之单例模式
文章の目录一、什么是单例模式二、如何实现单例模式1、利用JavaScript中的全局对象2、静态成员改造参考写在最后一、什么是单例模式 单例模式也称为单体模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。 举个栗子:一个班级只有一…...

[oeasy]python0086_ASCII_出现背景_1963年_DEC_PDP系列主机_VT系列终端
编码进化 回忆上次内容 上次 回顾了 字符编码的新陈代谢 ibm 曾经的EBCDIC 由于 字符不连续导致 后续 出现无数问题 随着 网络的发展 数据交换的 需要原来的小隐患现在 产生了 巨大问题 Bemer 联合各方巨头 想要推出 字符连续的编码集 这新编码集 具体长什么样 呢࿱…...