1. 程式人生 > >劍指offer(二十,二十一,二十二)包含min函式的棧,字串的排列,陣列中出現超過一半的數字

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

20:包含min函式的棧

題目描述
定義棧的資料結構,請在該型別中實現一個能夠得到棧最小元素的min函式。

感覺題目很無聊。。。我大js做這題就是方便,也讓我深刻意識到相對其他語言js繼承的強大性和靈活性。。。

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。

簡單題,hash一下,主要注意的就是js弱型別陣列的處理。。。。

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;
    }
}

相關推薦

offer()包含min函式字串排列陣列出現超過一半數字

20:包含min函式的棧 題目描述 定義棧的資料結構,請在該型別中實現一個能夠得到棧最小元素的min函式。 感覺題目很無聊。。。我大js做這題就是方便,也讓我深刻意識到相對其他語言js繼承的強大性和靈活性。。。 var stack = []; function push(node) { stack

offer(59)按之字形順序打印叉樹

eve 就是 是我 數據結構 rev 其他 正常的 正常 nbsp 題目描述 請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。 題目分析 這道題還是需要畫圖分析,不然不好找規

offer{面試題23:從上往下列印叉樹}

簡單的二叉樹層序遍歷,利用佇列的先進先出結構 關於層序遍歷層序遍歷 貼程式碼 public class Test23 { /** * 二叉樹的樹結點 */ public static class BinaryTreeNode { int

offer程式設計題(JAVA實現)——第38題:叉樹的深度

github https://github.com/JasonZhangCauc/JZOffer 劍指offer程式設計題(JAVA實現)——第38題:二叉樹的深度 題目描

offer程式設計題(JAVA實現)——第26題:叉搜尋樹與雙向連結串列

github https://github.com/JasonZhangCauc/JZOffer /** * * 劍指offer程式設計題(JAVA實現)——第26題:二叉搜尋樹與雙向連結串列

offer程式設計題(JAVA實現)——第24題:叉樹中和為某值的路徑

github https://github.com/JasonZhangCauc/JZOffer import java.util.ArrayList; /** * * 劍指offer程式設計題

【LeetCode & offer刷題】樹題6:28 對稱叉樹(101. Symmetric Tree)

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...) 101. Symmetric Tree       /**  * Def

Offer面試題6(Java版):重建叉樹

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重新構造出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中不包含重複的數字。例如輸入的前序遍歷序列為{1,2,4,7,3,5,6,8}和中序遍歷為{4,7,2,1,5,3,6,8},則重建出二叉樹並輸出它的頭結點。 在二叉樹的前

Offer行榜【牛客網】練習(

1、旋轉陣列的最小數字 題目描述: 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若

Offer學習】【面試題59:對稱的叉樹】

題目:請實現一個函式來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。 解題思路   通常我們有三種不同的二叉樹遍歷演算法,即前序遍歷、中序遍歷和後序遍歷。在這三種遍歷演算法中,都是先遍歷左子結點再遍歷右子結點。我們是否可以

Offer面試題:21.從上到下列印叉樹

一、題目:從上到下列印二叉樹 題目:從上往下打印出二叉樹的每個結點,同一層的結點按照從左到右的順序列印。例如輸入下圖中的二叉樹,則依次打印出8、6、10、5、7、9、11。   二叉樹節點的定義如下,採用C#語言描述: public class BinaryTreeNode

Offer(第二版)面試題7:重建叉樹

劍指Offer面試題7:重建二叉樹題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷中都不包含重複的數字。例如前序遍歷序列為{1,2,4,5,3,7,6}和中序遍歷序列{4,2,5,1,7,3,6},則可以重建一棵二叉樹。如圖所示:  

Offer之面試題23:從上往下列印叉樹

所有程式碼均通過G++編譯器測試,僅為練手紀錄。 //面試題23:從上往下列印二叉樹 //題目:從上往下打印出二叉樹的每個結點,同一層的結點按照從左到右的順序列印。 //面試題23:從上往下列印二

Offer面試題61:按之子型列印叉樹 Java實現

/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 號:v1.0

offer:第14題輸入組數奇數前偶數後

package cn.itcast.pro_6; /*輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序, * 使得所有的奇數位於陣列的前半部分,所有的偶數位於位於陣列的後半部分, * 並保證奇數和奇數,偶數和偶數之間的相對位置不變。 */ impor

Offer刷題筆記(java實現)_39.陣列次數超過一半數字

陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。 例如輸入陣列:{1,3,3,2,3,2,3,3,2}。由於2在陣列中出現了5次,超過陣列長度的一半,因此要輸出2。 三種解法: 第一種遍歷陣列,利用hashMap儲存每個數字出現的次數,時間複雜度O(n)

offer{25-30}】複雜連結串列的複製、字串排列陣列出現次數超過一半數字、最小的K個數、連續子陣列的最大和

複雜連結串列的複製、字串的排列、陣列中出現次數超過一半的數字、最小的K個數、連續子陣列的最大和 複雜連結串列的複製 題目描述 輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節

offer:陣列出現超過次數超過一半數字(python實現)

題目描述 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。 思路1:用字典的鍵值對實現,鍵存放陣列中的數字,值

Offer-題48(Java版):最長不含重複字元的子字串

參考自:《劍指Offer——名企面試官精講典型程式設計題》 題目:最長不含重複字元的子字串 請從字串中找出一個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含從’a’到’z’的

offer系列()最小的k個數 連續子陣列的最大和整數1出現的個數

最小的k個數 題目描述 輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 解題思路: 思路1,這一題應用堆排序演算法複雜度只有O(nlog k),堆是完全二叉樹的一種,最大堆就是最上面的數是最大的,該方法基於二