劍指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),堆是完全二叉樹的一種,最大堆就是最上面的數是最大的,該方法基於二