楼主: sicilianee
跳转到指定楼层
上一主题 下一主题
收起左侧

记录

🔗
 楼主| sicilianee 2018-6-14 13:20:46 | 只看该作者
全局:
sicilianee 发表于 2018-6-14 12:46
One thing you missed is the mod, which means it could be pretty big.

DP version. Remember to mod.

/**
* @param {string} s
* @return {number}
*/
var numDecodings = function(s) {
  if (!s) {return 0}
  const mod = Math.pow(10, 9) + 7
  const len = s.length
  // dp[i], num decodings for s.slice(0, i + 1)
  const dp = Array(len).fill(0)
  for (let i = 0; i < len; i++) {
    const second = []
    const first = []

    // get second list
    const c = s[i]
    if (c === '*') {
      for (let i = 1; i <= 9; i++) {
        second.push(String(i))
      }
    } else {
      // 0 - 9
      second.push(c)
    }
    // get first list
    if (i > 0) {
      const pc = s[i - 1]
      // 10 - 19
      // 20 - 29
      // so only 1 and 2 is allowed
      if (['1', '2'].includes(pc)) {
        first.push(pc)
      } else if (pc === '*') {
        first.push('1', '2')
      }
    }

    let res = 0
    // use only second itself, anything but 0
    const prevCount = i === 0 ? 1 : dp[i - 1]
    const noZero = second.filter(c => c !== '0')
    res += (noZero.length * prevCount) % mod
    // use both second and first
    if (i > 0) {
      const prevTwo = i === 1 ? 1 : dp[i - 2]
      let count = 0
      for (const fc of first) {
        for (const sc of second) {
          const str = fc + sc
          const numStr = Number.parseInt(str, 10)
          if (numStr <= 26) {
            count++
          }
        }
      }
      res = (res + (count * prevTwo) % mod) % mod
    }
    dp[i] = res
  }
  return dp[len - 1]
};


console.log(numDecodings('*') === 9)
console.log(numDecodings('1*') === 18)
回复

使用道具 举报

🔗
 楼主| sicilianee 2018-6-14 13:21:50 | 只看该作者
全局:
sicilianee 发表于 2018-6-14 13:20
DP version. Remember to mod.

/**

space could be reduced to constant. check writeup.
回复

使用道具 举报

🔗
 楼主| sicilianee 2018-6-14 14:24:00 | 只看该作者
全局:
0613 2. Valid Number



/**
* @param {string} s
* @return {boolean}
*/
var isNumber = function(s) {
  // first, trim
  if (!s) {return false}
  s = s.trim()
  if (!s) {return false}
  const range = /[^0-9e.+-]/
  // no other characters
  if (range.test(s)) {
    return false
  }
  // no more than one dot or e
  let dot = 0
  let exp = 0
  for (let c of s) {
    if (c === '.') {dot++}
    if (c === 'e') {exp++}
  }
  if (exp > 1 || dot > 1) {
    return false
  }

  // if has e, split by e, check both sides not empty
  // first, +-000#.#
  // second, +-000#

  const test = (str, withDot) => {
    if (!str) { return false }
    if (['+', '-'].includes(str[0])) {
      str = str.slice(1)
    }
    // nore more +-
    if (/[+-]/.test(str)) {
      return false
    }
    if (withDot) {
      if (str === '.') {
        return false
      }
    } else {
      if (str.includes('.')) {
        return false
      }
    }
    if (!str) {
      return false
    }
    return true
  }

  if (s.includes('e')) {
    let [one, two] = s.split('e')
    if (!test(one, true) || !test(two, false)) {
      return false
    }
  } else {
    if (!test(s, true)) {
      return false
    }
  }
  return true
};


console.log(isNumber('0') === true)
console.log(isNumber('0.1') === true)
console.log(isNumber('abc') === false)
console.log(isNumber('1 a') === false)
console.log(isNumber('2e10') === true)

// my test cases
console.log(isNumber('000000') === true)
console.log(isNumber('+0') === true)
console.log(isNumber('-0e-0') === true)
console.log(isNumber(' -0e-0   ') === true)
console.log(isNumber(' 000-0e-0   ') === false)
console.log(isNumber(' -0.4e004   ') === true)
console.log(isNumber(' e   ') === false)
console.log(isNumber(' -4.e0   ') === true)
console.log(isNumber(' -4.e   ') === false)
console.log(isNumber(' e5   ') === false)
回复

使用道具 举报

🔗
 楼主| sicilianee 2018-6-14 14:34:34 | 只看该作者
全局:
It's been fun.
回复

使用道具 举报

🔗
1点50分 2018-7-21 23:11:14 | 只看该作者
全局:
really fun after going though the records
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表