3

题目

input: n
output: 1...n中的数字可以分割出来的连续数字串的所有组合,不同组合之间用一个'和'连接

示例:
input: 3
output: 1,2,3和1,23和12,3和123

input: 4
output: 1,2,3,4和12,3,4和1,23,4和1,2,34和12,34和123,4和1,234和1234

这里给同学提个醒。。再往下直接就是我写得解题思路了,希望大家可以先自己思考一下这个问题。
















解题思路

利用二叉树。

input = 1时,output = 1
input = 2时,output = 1,2和12,其实我们可以看做output = ('1' + ',2') + '和' + ('1' + '2')
input = 3时,output = 1,2,3和12,3和1,23和123,其实我们可以看做output = ('1,2' + ',3') + '和' + ('12' + ',3') + 和 + ....

下面用一个图来说明n为5的时候的解决思路

图片描述

也就是说,n=5时候的输出,是由n=4的输出和'5', ',5'进行组合后的来的。

说到这这个题就很容易解决了,利用二叉树的层次遍历,每一层遍历的时候都基于上一层的遍历结果生成答案。

代码

function solution (n) {
    let result = ['1'] // 存放当前遍历层次的结果
    for (let i = 2; i <= n; i++) { // i 为当前遍历到的层数
        for (let j = Math.pow(2, i - 2); j >= 1; j--) { // j 为上一层共有结点数}
            let temp = result.shift() // 取出一个结果
            result.push(`${temp},${i}`) // 放进 temp + ,i
            result.push(`${temp}${i}`) // 放进 temp + i
        }
    }
    return result.join('和')
}

输出测试:
图片描述

这个算法的时间空间复杂度均为O(二叉树的节点数),也就是O(2^n)

那么这个算法题就到这了,如果大家又什么好的想法或者我的有什么问题,欢迎在讨论区和我交流


GDUTxxZ
109 声望4 粉丝

正在做或者想做的事情: