「leetcode」561. 數組拆分 I;796. 旋轉字符串;189. 旋轉數組;459. 重複的子字符串;575. 分糖果

前言

一些水題,gaga~~數組

561. 數組拆分 I

原題

給定長度爲 2n 的數組, 你的任務是將這些數分紅 n 對, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得從1 到 n 的 min(ai, bi) 總和最大。bash

示例 1:ui

輸入: [1,4,3,2]

輸出: 4
解釋: n 等於 2, 最大總和爲 4 = min(1, 2) + min(3, 4)
複製代碼

思路

水題,在對數組內容進行分對的時候,並不須要考慮數組的順序。因此,只需將數組從小到大進行排序,而後取數組中的全部偶數位便可。spa

代碼

/** * @param {number[]} nums * @return {number} */
var arrayPairSum = function(nums) {
    let result = 0
    nums = nums.sort((a, b) => a - b)
    for (let i = 0; i < nums.length; i+=2) {
        result += nums[i]
    }
    return result
};
複製代碼

796. 旋轉字符串

原題

給定兩個字符串, A 和 B。code

A 的旋轉操做就是將 A 最左邊的字符移動到最右邊。 例如, 若 A = 'abcde',在移動一次以後結果就是'bcdea' 。若是在若干次旋轉操做以後,A 能變成B,那麼返回True。cdn

示例 1:blog

輸入: A = 'abcde', B = 'cdeab'
輸出: true
複製代碼

示例 2:排序

輸入: A = 'abcde', B = 'abced'
輸出: false
複製代碼

思路

舉兩個例子字符串

// 例子1
var a = 'abcde'
var a2 = 'abcdeabcde' // a + a
a2.includes('cdeab') // true

// 例子2
var b = 'abcde'
var b2 = 'abcdeabcde'
b2.includes('abced') // false
複製代碼

若是B字符串由A字符串旋轉而來,那麼B字符串必然會出如今,兩個A字符串相連造成的新字符串S中。string

代碼

/** * @param {string} A * @param {string} B * @return {boolean} */
var rotateString = function(A, B) {
    return A.length === B.length && ~(A + A).indexOf(B)
};
複製代碼

189. 旋轉數組

原題

給定一個數組,將數組中的元素向右移動 k 個位置,其中 k 是非負數。

示例 1:

輸入: [1,2,3,4,5,6,7] 和 k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右旋轉 1 步: [7,1,2,3,4,5,6]
向右旋轉 2 步: [6,7,1,2,3,4,5]
向右旋轉 3 步: [5,6,7,1,2,3,4]
複製代碼

示例 2:

輸入: [-1,-100,3,99] 和 k = 2
輸出: [3,99,-1,-100]
解釋: 
向右旋轉 1 步: [99,-1,-100,3]
向右旋轉 2 步: [3,99,-1,-100]
複製代碼

思路

當k大於nums的長度時,那麼k中只有k % nums.length次是有效的旋轉,由於在旋轉nums.length次時,數組就會從新回到初始的狀態。咱們在排除這些無用的旋轉後,可避免當k過大時運行超時問題。

代碼

/** * @param {number[]} nums * @param {number} k * @return {void} Do not return anything, modify nums in-place instead. */
var rotate = function(nums, k) {
    const len = nums.length
    
    if (k > len) {
        k = k % len
    }
    
    while (k > 0) {
        let last = nums.pop()
        nums.unshift(last)
        k--
    }
    
    return nums
};
複製代碼

459. 重複的子字符串

原題

給定一個非空的字符串,判斷它是否能夠由它的一個子串重複屢次構成。給定的字符串只含有小寫英文字母,而且長度不超過10000。

示例 1:

輸入: "abab"

輸出: True

解釋: 可由子字符串 "ab" 重複兩次構成。
複製代碼

示例 2:

輸入: "aba"

輸出: False
複製代碼

示例 3:

輸入: "abcabcabcabc"

輸出: True

解釋: 可由子字符串 "abc" 重複四次構成。 (或者子字符串 "abcabc" 重複兩次構成。)
複製代碼

思路

舉兩個例子

// 例子1
var a = 'abab'
var a2 = 'abababab' // a + a
a2.indexOf(a, 0) // 0
a2.indexOf(a, 1) // 2
a2.indexOf(a, 3) // 4
複製代碼

當一個字符串A是由它的一個子串重複屢次構成時,那麼兩個字符串A相加造成的新字符串S中,至少包含3次的A

QQ20191020-144451@2x.png

代碼

/** * @param {string} s * @return {boolean} */
var repeatedSubstringPattern = function(s) {
    return (s + s).indexOf(s, 1) !== s.length
};
複製代碼

575. 分糖果🍬

原題

給定一個偶數長度的數組,其中不一樣的數字表明着不一樣種類的糖果,每個數字表明一個糖果。你須要把這些糖果平均分給一個弟弟和一個妹妹。返回妹妹能夠得到的最大糖果的種類數。

示例 1:

輸入: candies = [1,1,2,2,3,3]
輸出: 3
解析: 一共有三種種類的糖果,每一種都有兩個。
     最優分配方案:妹妹得到[1,2,3],弟弟也得到[1,2,3]。這樣使妹妹得到糖果的種類數最多。
複製代碼

示例 2 :

輸入: candies = [1,1,2,3]
輸出: 2
解析: 妹妹得到糖果[2,3],弟弟得到糖果[1,1],妹妹有兩種不一樣的糖果,弟弟只有一種。這樣使得妹妹能夠得到的糖果種類數最多。
複製代碼

注意:

  • 數組的長度爲[2, 10,000],而且肯定爲偶數。
  • 數組中數字的大小在範圍[-100,000, 100,000]內。

思路

對數組進行去重後獲得的數組的長度,既是糖果種類的長度。

若是糖果種類的長度,大於所有糖果數量的一半,妹妹能夠最多得到糖果數量 / 2種類的糖果。

若是糖果種類的長度,小於所有糖果數量的一半,妹妹能夠得到所有種類的糖果。

代碼

/** * @param {number[]} candies * @return {number} */
var distributeCandies = function(candies) {
    const k = new Set(candies).size
    return k > candies.length / 2 ? candies.length / 2 : k
};
複製代碼
相關文章
相關標籤/搜索