劍指offer(二十,二十一,二十二)包含min函數的棧,字符串的排列,數組中出現超過一半的數字

20:包含min函數的棧

題目描述
定義棧的數據結構,請在該類型中實現一個可以獲得棧最小元素的min函數。java

感受題目很無聊。。。我大js作這題就是方便,也讓我深入意識到相對其餘語言js繼承的強大性和靈活性。。。node

var stack = [];
function push(node)
{
    stack.push(node);
}
function pop()
{
    stack.pop();
}
function top()
{
    return stack[stack.length-1];
}
function min()
{
    return Math.min.call(null,...stack);
}


/*js作起來就是簡單,若是用Java作有下面一個思路:
 
思路:用一個棧data保存數據,用另一個棧min保存依次入棧最小的數
好比,data中依次入棧,5,  4,  3, 8, 10, 11, 12, 1
       則min依次入棧,5,  4,  3,no,no, no, no, 1
 
no表明這次不如棧
每次入棧的時候,若是入棧的元素比min中的棧頂元素小或等於則入棧,不然不如棧。
import java.util.Stack;
public class Solution {
    Stack<Integer> data = new Stack<Integer>();
    Stack<Integer> min = new Stack<Integer>();
    Integer temp = null;
    public void push(int node) {
        if(temp != null){
            if(node <= temp ){
                temp = node;
                min.push(node);
            }
            data.push(node);
        }else{
            temp = node;
            data.push(node);
            min.push(node);
        }
    }
     
    public void pop() {
        int num = data.pop();
        int num2 = min.pop();
        if(num != num2){
           min.push(num2);
        }
    }
     
    public int top() {
        int num = data.peek();
        return num;
    }
     
    public int min() {
        int num = min.peek();
        return num;
    }
}
*/

27:字符串的排列

題目描述
輸入一個字符串,按字典序打印出該字符串中字符的全部排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的全部字符串abc,acb,bac,bca,cab和cba。
輸入描述:
輸入一個字符串,長度不超過9(可能有字符重複),字符只包括大小寫字母。數組

經典dfs題,主要是交換思想,遞歸樹遍歷的第一層(非根)就是a(第一個位置)和其餘全部位置的交換,下一層就是第一個位置肯定了,第二個位置和剩下位置的交換,下下層。。。依次推。其實push的是最後的葉子節點,這裏葉子節點也就是到邊界條件,注意也要第一次也要和本身交換,過程當中的是不會被push的,好比第二層的abc仍是要走交換流程返回到第三層的abc才能被push到,這就是邊界條件。
這裏寫圖片描述數據結構

注意最大的坑。。用js語言作的話不要瞎返回null什麼的,主要看題目,若是返回多個就返回空數組[],單個返回0什麼的。這個坑了一天。。。。=-=函數

function Permutation(str)
{
    let ans = [];
    let arr = str.split("");
    if(str.length===0) return [];
    dfs(ans,arr,0);
    // ans.map(function (item,index) {
    //     return item.join("");
    // })
    ans = ans.filter(function (item,index) {
        return ans.indexOf(item)===index;
    });
    return ans.sort();

}
function dfs(ans,arr,begin) {
    if (begin === arr.length - 1) {
        // let tmp = arr;
        // ans.push(JSON.parse(JSON.stringify(arr)));
        let tmp = arr.join("");
        ans.push(tmp);
        // ans.push(arr);
        // console.log(ans);
    }
    for (let i = begin; i < arr.length; i++) {
        if (i !== begin && arr[begin] === arr[i])
            continue;
        // let _arr = swap(arr,begin, i);
        swap(arr,begin,i)
        // console.log(arr);
        dfs(ans, arr, begin + 1);
        swap(arr,begin, i);
    }
}

function swap(arr,a,b){
    let tmp = arr[a];
    arr[a] = arr[b];
    arr[b] = tmp;
    // return arr;
}

28:數組中出現超過一半的數字

題目描述
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲9的數組{1,2,3,2,2,2,5,4,2}。因爲數字2在數組中出現了5次,超過數組長度的一半,所以輸出2。若是不存在則輸出0。code

簡單題,hash一下,主要注意的就是js弱類型數組的處理。。。。blog

function MoreThanHalfNum_Solution(numbers)
{   

    var len = numbers.length;
    if(len===0)
      return 0;
    let cnt = [],index;
    for(let i = 0; i < len; i++) {
      index = numbers[i];
      cnt[index]===undefined||NaN? cnt[index]=1 : cnt[index]++;
    }
    //console.log(cnt);
    let max = -1;
    let cur = 0;
    let cntlen = cnt.length;
    for(let i = 0; i < cntlen; i++) {
      if(!cnt[i]) continue;
      max = max>cnt[i]? max : (cur = i,cnt[i])
    }
    if(max>(len/2)) {
      return cur;
    }else {
      return 0;
    }
}
相關文章
相關標籤/搜索