从零开始的LeetCode竞赛解题-周赛 183

381 阅读2分钟

1403. 非递增顺序的最小子序列

思路:排序后从首位开始查找即可

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var minSubsequence = function(nums) {
    if(nums.length === 0) {
        return [];
    }
    const sum = nums.reduce((res, i) => res + i);
    nums.sort((a,b) => b-a)
    console.log(nums)
    let res = 0;
    let i = 0;
    for(; i < nums.length; i++) {
        res += nums[i];
        console.log(sum - res, res);
        if(sum - res < res) {
            break;
        }
    }
    return nums.slice(0, i + 1);
};

1404. 将二进制表示减到 1 的步骤数

思路:

二进制表示中尾数为1为奇数,尾数为0为偶数。

1:从后向前数1的个数,len(1)+1为此段区间的步数,并将此段最前面一位1-1设置为1 例:1110111 第一次:变为1111(111),步数为括号中的3+1=4

2:数0个数,step为0的个数

3:以此类推,直到结果为1

/**
 * @param {string} s
 * @return {number}
 */
var numSteps = function(s) {
    let step = 0;
    let sArr = s.split('');
    let len = 0;
    for(let i = sArr.length - 1; i >= 0; i--) {
        if(i === 0 && sArr[i] === '1' && (sArr[i+1] === '0' || sArr.length === 1) ) {
            return step;
        }
        if(sArr[i] === '0') {
            for(let j = i; j >= 0; j--) {
                if(sArr[j] === '0') {
                    step++;
                } else {
                    i = j + 1;
                    break;
                }
            }
        } else if(sArr[i] === '1') {
            let fl = false;
            for(let j = i; j >= 0; j--) {
                if(sArr[j] === '1') {
                    step++;
                } else {
                    step++;
                    i = j + 1;
                    sArr[j] = '1';
                    fl = true;
                    break;
                }
            }
            if(!fl) {
                step++;
                i=0;
            }
        }
    }
    return step;
};

1405. 最长快乐字符串

思路:

字符按照数量排序后取数量最大字符插入(2个,如只有1个则插入1个),然后插入数量最少的字符

注意判断排序后最大字符是否与字符串尾数相同,如果相同,则只插入一个

!!!此题不存在为空的情况,因为只要a,b,c > 0,那就必定至少有一个"a","b","c"兜底

/**
 * @param {number} a
 * @param {number} b
 * @param {number} c
 * @return {string}
 */
var longestDiverseString = function(a, b, c) {
    let str = '';
    const arr = [
            {key: 'a', val: a},
            {key: 'b', val: b},
            {key: 'c', val: c}
    ];
    const getSorted = () => {
        arr.sort((oa, ob) => {
            return ob.val - oa.val
        });
    }
    getSorted();
    while(arr[0].val !== 0) {
        if(arr[0].val === 1) {
            arr[0].val -= 1;
            str += arr[0].key;
        } else {
            if(arr[0].key === str[str.length - 1]) {
                arr[0].val -= 1;
                str += arr[0].key;    
            } else {
                arr[0].val -= 2;
                str += arr[0].key + arr[0].key;
            }
        }
        if(arr[2].val === 0) {
            if(arr[1].val === 0) {
                return str;
            } else {
                arr[1].val -= 1;
                str += arr[1].key;
            }
        } else {
            arr[2].val -= 1;
            str += arr[2].key;
        }
        
        getSorted();
        console.log(arr, str);
    }
    return str;
};

1406. 石子游戏 III

属于我的算法盲区--动态规划……学习后再来