题目描述
定义栈的数据结构,请在该类型中实现一个可以获得栈最小元素的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; } } */
题目描述
输入一个字符串,按字典序打印出该字符串中字符的全部排列。例如输入字符串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; }
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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; } }