leetCode刷题

https://github.com/guojingwen/leetcode/tree/master/ts


汉诺塔

image.png

KMP算法

image.png
举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”?

  1. // 暴力破解
  2. const str = "BBC ABCDAB ABCDABCDABDE"
  3. const subStr = 'ABCDABD'
  4. function strIndexOf(str, substr) {
  5. if(substr.length > str.length) return false
  6. for(let i = 0; i <= str.length - substr.length; i++) {
  7. if(str.substr(i, substr.length) === substr) {
  8. return i
  9. }
  10. }
  11. return -1
  12. }
  13. console.log(strIndexOf(str, subStr))
  14. // KMP算法
  15. function KMPSearch (str1, str2) {
  16. const kmpNext = createKMPNext(str2)
  17. for (let i = 0, j = 0; i < str1.length; i++) {
  18. while (j > 0 && str1[i] !== str2[j]) {
  19. j = kmpNext[j - 1]
  20. }
  21. if (str1[i] === str2[j]) {
  22. j++
  23. }
  24. if (j === str2.length) {
  25. return i - j + 1
  26. }
  27. }
  28. return -1
  29. }
  30. function createKMPNext (str2) {
  31. const arr = [0]
  32. for (let i = 1, j = 0; i < str2.length; i++) {
  33. while(j > 0 && str2[i] !== str2[j]){
  34. j = arr[j - 1]
  35. }
  36. if (str2[i] === str2[j]) {
  37. j++
  38. }
  39. arr[i] = j
  40. }
  41. return arr
  42. }
  43. KMPSearch("BBC ABCDAB ABCDABCDABDE", "ABCDABD")

八皇后问题

image.png

  1. function run(N) {
  2. let count = 0;
  3. const chess = Array.from(
  4. {length: N},
  5. () => Array.from(
  6. {length: N},
  7. () => 0,
  8. ),
  9. );
  10. putQueenByRow(chess, 0);
  11. function putQueenByRow(chess, row){
  12. if(row === chess.length) {
  13. count++;
  14. console.log(`the ${count} solution:`, chess);
  15. return
  16. }
  17. const chessTemp = JSON.parse(JSON.stringify(chess));
  18. for(let i = 0; i<N; i++){
  19. chessTemp[row].forEach((it, index) => {
  20. chessTemp[row][index] = 0;
  21. });
  22. chessTemp[row][i] = 1;
  23. if(checkIsSafe(chessTemp, row, i)) {
  24. putQueenByRow(chessTemp, row+1)
  25. }
  26. }
  27. }
  28. function checkIsSafe(chess, row, col){
  29. let step = 1;
  30. if(row >= 1 && chess[row -1][col] === 1) return false;
  31. if(col >= 1 && row >= 1 && chess[row -1][col - 1] === 1) return false;
  32. if(row >= 1 && col < chess.length && chess[row -1][col + 1] === 1) return false;
  33. return !chess.slice(0, row).some(rowArr => rowArr[col] === 1);
  34. }
  35. }

骑士周游问题

image.png
image.png

数据结构和算法的重要性
1)算法是程序的灵魂,优秀的程序可以在海量数据计算时,依然保持高速计算
2) 一般来讲程序会使用了内存计算框架(比如Spark)和缓存技术(比如Redis等)来优化程
序,再深入的思考一下,这些计算框架和缓存技术,它的核心功能是哪个 部分呢?
3) 拿实际工作经历来说,在Unix下开发服务器程序,功能是要支持上千万人同时在
线,在上线前,做内测,一切OK,可上线后,服务器就支撑不住了,公司的CTO对代
码进行优化,再次上线,坚如磐石。你就能感受到程序是有灵魂的,就是算法。
4) 目前程序员面试的门槛越来越高,很多一 线IT公司,都会有数据结构和算法面试题
(负责的告诉你,肯定有的)
5) 如果你不想永远都是代码工人,那就花时间来研究下数据结构和算法

image.png

image.png

image.png

image.png

image.png

image.png

image.png
image.png

image.png
image.png

image.png

最长回文字符串

  1. // 暴力破解
  2. function longestPalindrome(str) {
  3. let res = str[0];
  4. if(str.length < 2) return str[0];
  5. for(let i=0; i<str.length; i++) {
  6. for(let j=i; j<=str.length; j++) {
  7. const subStr = str.substring(i, j);
  8. if(isHuiWen(subStr) && subStr.length > res.length) {
  9. res = subStr
  10. }
  11. }
  12. }
  13. return res;
  14. }
  15. function isHuiWen(subStr){
  16. return subStr === [...subStr].reverse().join('');
  17. }
  18. // 双指针移动
  19. longestPalindrome2('abacab')
  20. function longestPalindrome2(str){
  21. let longSubStr = str[0];
  22. run(str);
  23. function run(str){
  24. let i =0, j = str.length - 1;
  25. for(;;) {
  26. if (i >= j) {
  27. if(longSubStr.length < str.length) {
  28. longSubStr = str;
  29. }
  30. return;
  31. }
  32. if (str[i] === str[j]) {
  33. i++;
  34. j--;
  35. } else {
  36. run(str.substring(0, str.length - 1));
  37. run(str.substring(1, str.length));
  38. return;
  39. }
  40. }
  41. }
  42. console.log(longSubStr)
  43. }

动态规划解法
abbacbca 中
dp[i][j] 表示第 i到j(包含j)个字符串是否是回文

i\j a b b a c b c a
dp[i][j] 0 1 2 3 4 5 6 7
0 a 1 / / / / / / /
1 b 0 1 / / / / / /
2 b 0 1 1 / / / / /
3 a 1 0 0 1 / / / /
4 c 0 0 0 0 1 / / /
5 b 0 0 0 0 0 1 / /
6 c 0 0 0 0 1 0 1 /
7 a 0 0 0 1 0 0 0 1

从上图可以得出规律

  • dp[j][i] 如果 i > j 开始位置不能比结束位置大,
  • i === j 填充dp[j][i] = 1
  • j - i === 1 的时候 填充 dp[j][i] 依据 str[j] === str[j-1]
  • j - i === 2 的时候 填充 dp[j][i] 依据 dp[j-1][i+1] 为 1 且 str[j] === str[j-2] 成立则为1
  • 类推 如果 j - i > = 2 设 step = j-i 填充 dp[j][i] 依据 dp[j-1][j-step+1] 为 1 且 str[j] === str[j-step] 成立则为1
  • 找出最长回文字符串

    1. // 动态规划
    2. // 以 "abbacbca"为例子
    3. function longestPalindrome2 (str) {
    4. if(str.length < 2) return str[0]
    5. // dp[j][i] 表示第 i到j(包含j)个字符串是否是回文
    6. const dp = Array(str.length).fill(' ').map(item => Array(str.length).fill(' '))
    7. // i === j 填充dp[j][i] = 1
    8. for(let i = 0; i < str.length; i++) {
    9. dp[i][i] = 1
    10. }
    11. // j - i === 1 的时候 填充 dp[j][i] 依据 str[j] === str[j-1]
    12. for(let j = 1; j < str.length; j++) {
    13. dp[j][j - 1] = (str[j] === str[j-1]) ? 1 : 0
    14. }
    15. // console.log(dp.map(items => items.join()).join("\n"))
    16. // j - i > 1的时候
    17. // 如果 j-i===2 时 填充 dp[j][i] 依据 dp[j-1][i+1] 为 1 且 str[j] === str[j-2] 成立则为1
    18. // 如果 j - i > = 2 设 step = j-i 填充 dp[j][i] 依据 dp[j-1][j-step+1] 为 1 且 str[j] === str[j-step] 成立则为1
    19. let step = 2 // j-i === 2 回文串长度为3 str.substring(i, j + 1)
    20. while (step < str.length) {
    21. for(let j = step; j < str.length; j++) {
    22. // i = j - step
    23. // console.log(`${j-step}:${j}:${dp[j-1][j-step+1]} `, str.substring(j- step, j + 1), `${str[j-step]}:${str[j]}`)
    24. if(dp[j-1][j-step+1] && (str[j-step] === str[j])) {
    25. dp[j][j-step] = 1
    26. } else {
    27. dp[j][j-step] = 0
    28. }
    29. }
    30. step++
    31. }
    32. console.log(dp.map(items => items.join()).join('\n'))
    33. // 找出最长回文字符串
    34. for(let step2 = str.length; step2 > 0; step2--) {
    35. for(let j = step2; j < str.length; j++) {
    36. const i = j - step2;
    37. console.log(i,j, str.substring(i, j+1))
    38. if(dp[j][i]) {
    39. let result = str.substring(i, j+1)
    40. // console.log(result)
    41. return result
    42. }
    43. }
    44. }
    45. }
    46. longestPalindrome2('abbacbca')

马拉车算法,后面在学 https://www.bilibili.com/video/BV1rg4y1b71i?p=3

商品规格算法

https://static.warmplace.cn:10443/suanfa/sku.html