Kros的博客 Kros的博客
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云

Kros

凡心所向,素履以往,生如逆旅,一苇以航
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云
  • 每日算法

    • 信
    • 独一无二的出现次数
    • 按奇偶排序数组Ⅱ
    • 两数之和
    • 两数相加2
    • 寻找两个正序数组的中位数
    • 二叉树最大深度
    • 洗牌算法
    • 移动零
    • 数组元素排列组合
    • 上升下降字符
    • 最大间距
    • 四数相加2
    • 最大三角周长
    • 在排序数组中查找元素的起始位置
    • 最富有客户的资产总量
    • 打印规定循环字符串
    • 从m个数中选择n个数的组合
    • 复原IP地址
    • 有效的数独
    • 旋转图像
    • 缺失的第一个正整数
    • 第 N 个泰波那契数
    • 轮转数组
    • 爬楼梯
    • 斐波那契数列
    • 使用最小花费爬楼梯
    • 打家劫舍
    • 删除并获得点数
    • 颜色分类
    • 字母异分词分组
    • 加一
    • N叉树的层序遍历
    • N叉树的前序遍历
    • N叉树的后序遍历
    • N叉树的深度
    • 二叉树的中序遍历
    • 和并两个有序数组
    • 移除元素
    • 删除有序数组中的重复项Ⅱ
    • 多数元素
    • 找到数组的中间位置
    • 搜索插入位置
    • 最长连续序列
    • 三数之和
    • 找到字符串中所有字母异位词
    • 有效的括号
    • 最小栈
    • 求出硬币游戏的玩家
    • Find the odd int
    • Regex validate PIN code
    • Find the next perfect square
  • 折腾

  • 分享

  • 随笔
  • 每日算法
kros
2024-03-04

复原IP地址

题目:复原IP地址,leetcode

题解: 第一眼看到这个题目时,我首先想到的是使用递归循环拆分,后面实现时发现ip格式比较固定,只需要将字符串拆分为四块。 说到分块问题就必须想到切蛋糕和割绳子的问题,这里ip地址又有点不同(无需考虑顺序),我们只需要在字符串中插入几个.。 这里就可以把问题简化成从字符串的空位中选择3个位置插入.,又回到了上一篇从m个数中选择n个数的组合

实现代码如下:

 // 0~10 
const s = '25525511135'
// 从m个数中选择n个数的组合
const test = function(m, n) {
  if (n < 1 || m < n) return []
  const result = []
  // 初始化选中下标
  let str = '1'.repeat(n) + '0'.repeat(m - n)
  result.push(str.split(''))
  while(str.indexOf('10') >= 0) {
    // 找到第一个10 替换成01
    const idx = str.indexOf('10')
    str = str.slice(0, idx) + '01' + str.slice(idx + 2)
    // 移动idx左边的到最左边
    let prefix = str.slice(0, idx)
    const oneArr = str.slice(0, idx).match(/[1]/g)
    if (oneArr && oneArr.length) {
      prefix = '1'.repeat(oneArr.length) + '0'.repeat(prefix.length - oneArr.length)
    }
    str = prefix + str.slice(idx)
    result.push(str.split(''))
  }
  return result
}
// 从字符串的间隔s.length - 1中选择3个位置放‘.’
const arr = test(s.length - 1, 3)
const ipValid = []
for(let i = 0; i < arr.length; i++) {
  const idxArr = arr[i].map((i, idx) => i == '1' ? (idx + 1) : 0).filter(i => i > 0)
  const ipArr = [s.slice(0, idxArr[0]), s.slice(idxArr[0], idxArr[1]), s.slice(idxArr[1], idxArr[2]), s.slice(idxArr[2])]
  // console.log(idxArr, ipArr)
  if (ipArr.every(ip => !ip.startsWith('0') && parseInt(ip) <= 255 && parseInt(ip) > 0)) {
    ipValid.push(ipArr.join('.'))
  }
}
console.log(ipValid)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
上次更新: 2025/09/05, 8:09:00
从m个数中选择n个数的组合
有效的数独

← 从m个数中选择n个数的组合 有效的数独→

最近更新
01
Find the next perfect square
09-05
02
Regex validate PIN code
09-05
03
Find the odd int
09-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 kros king
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
icon-heart-o icon-heart icon-infinity icon-pause icon-play link next prev