【问题标题】:How to optimize memory in an algorithm如何在算法中优化内存
【发布时间】:2021-09-06 22:23:43
【问题描述】:

我该如何优化这个

如果字符串可以在没有余数的情况下拆分为 4、422 和 2222,则返回 true

测试:

  • 输入“4”输出“真”(4)
  • 输入“44”输出“真”(4 4)
  • 输入 "42" 输出 false(4 2!==2222 || 422 || 4)
  • 输入“4224224”输出真(422 422 4)
  • 输入“42222”输出真(4 2222)
  • 输入“22224”输出真(2222 4)

let solution = (password) => {
  if (!password) return false

  while (password) {

    if (password.includes('2222')) {
      while (password.includes('2222')) {
        password = password.replace('2222', '')
      }
    }
    if (password.includes('422')) {
      while (password.includes('422')) {
        password = password.replace('422', '')
      }
    }
    if (password.includes('4')) {
      while (password.includes('4')) {
        password = password.replace('4', '')
      }
    }
    return !!!password
  }
}

console.log(solution('4'));
console.log(solution('44'));
console.log(solution('42'));
console.log(solution('4224224'));
console.log(solution('42222'));
console.log(solution('22224'));

这是一样的:

let solution = (password) => {
  const searchValue = ['2222', '422', '4']
  if (!password) return false
  for (let elem = 0, i = searchValue[0]; password; elem++) {
    if (password.includes(i)) {
      while (password.includes(i)) {
        password = password.replace(i, '')
      }
    }
    i = searchValue[elem]
    if (elem === 3) {
      return !!!password
    }
  }
  return !!!password
}

console.log(solution('4'));
console.log(solution('44'));
console.log(solution('42'));
console.log(solution('4224224'));
console.log(solution('42222'));
console.log(solution('22224'));

启动时的内存限制 - 100 MB

  • 必须使用 -> const bigStr = new Array(9999999).fill(() =>["4", "422", "2222" ][Math.floor(Math.random() * 3)]).map(f => f()).join('')
  • 对不起,我忘了说不允许使用正则表达式

【问题讨论】:

  • 真正的问题是什么?您有 100 MB,此代码需要更少的内存。为什么!!!password
  • 返回!布尔值。 (密码) 可以等于 999999 个元素的字符串
  • 我知道!password!!password!!!password 没有任何意义,尤其是当您想要优化时。它增加了两个不必要的操作。 !password === !!!password
  • 我已经更新了我的解决方案。看一看。这是你想要的吗?
  • 您的代码的空间复杂度是线性的O(n),这只是因为您将输入字符串存储在一个变量中。否则复杂性将是恒定的O(1)。你需要2 * password.length + O(1) 内存。你不能用 JavaScript 真正优化它。字符串是不可变的。您需要两个带有输入字符串的变量来修改字符串。 2 * 999999 个字符是 2 * 999999 个字节

标签: javascript string algorithm memory


【解决方案1】:

1)可以通过递归得到想要的结果

const matches = ["4", "2222", "422"];

function isMatch(str) {
  if (str.trim() === "") return true;

  for (let i = 0; i < matches.length; ++i) {
    if (str.startsWith(matches[i])) {
      if (isMatch(str.replace(matches[i], ""))) return true;
    }
  }
  return false;
}
console.log(isMatch("4"));
console.log(isMatch("44"));
console.log(isMatch("42"));
console.log(isMatch("4224224"));
console.log(isMatch("42222 "));
console.log(isMatch("2222"));

2)你可以在这里使用正则表达式\b(4|2222|422)+\b

const regex = /\b(4|2222|422)+\b/;

function isMatch(str) {
  return regex.test(str);
}
console.log(isMatch("4"));
console.log(isMatch("44"));
console.log(isMatch("42"));
console.log(isMatch("4224224"));
console.log(isMatch("42222 "));
console.log(isMatch("2222"));

【讨论】:

  • 对不起,我忘了说不允许使用正则表达式
  • @Nick 但为什么会这样,正则表达式是在字符串中搜索的最佳方法之一。
  • 他们很好。但这些都是问题的条件。
  • 递归具有更高的内存使用率。您正在为每个函数调用创建输入字符串的副本。在第二个递归步骤之后,这可能会超过内存限制。
  • AFAIK,但是100MB 足以运行类似的测试用例。
【解决方案2】:

您可以只使用replaceAll 而不是每次都替换字符串并检查它是否在另一个时间:

const bigStr = new Array(9999999).fill(() => ["4", "422", "2222"][Math.floor(Math.random() * 3)]).map(f => f()).join('');

const solution = (password) => {
  return password !== "" && !password.replaceAll('2222', '').replaceAll('422', '').replaceAll('4', '');
}

console.log(solution("4"));
console.log(solution("44"));
console.log(solution("42"));
console.log(solution("4224224"));
console.log(solution("42222"));
console.log(solution("2222"));
console.log(solution(bigStr))

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-07-19
  • 2012-06-28
  • 2011-06-29
  • 2017-05-12
  • 2019-10-17
  • 2016-12-05
  • 2011-03-05
  • 1970-01-01
相关资源
最近更新 更多