问题1:给定一个数组a和一个长度值l,生成一个指定长度值为l的新数组b,要求b中的每一个元素都是从a中随机获取的,且数组元素不可重复。
function generate(a,l){
if(a.length < l) return '老数组长度不足!';
/*a长度可能超出,可以生成新数组后截取长度为l的赋值给b,也可以生成为l的b(这里选第二种)*/
var i=0, tmp=[], b=[];
// 每次获取a的一个随机元素,同时将
while(i<l && tmp.length<=a.length) {
var random = Math.floor(Math.random()*(a.length));
if(tmp.indexOf(random) == -1) { // 判断随机元素是否已经使用过,未使用则放入临时数组记录
tmp.push(random);
var number = a[random]; // 获取数组a中的随机数
console.log(random+"..."+number);
if(b.indexOf(number) == -1) { //部分IE不支持indexOf请自行解决。也可以使用jquery的$.inArray方法,总之就是不重复扔进b
b.push(number);
i++; // 新随机数时+1
}
}
}
if(b.length==l) return b;
else return '新数组长度不足: '+ b;
}
// 测试
var a=[3,2,1,6,3,9,2,5];
generate(a, 5)
问题2:使用js写一个栈结构。然后如何让这个栈满足两个调用者同时使用的要求?
function Stack() {
this.dataStore = [];
this.top = 0;//栈顶元素的位置
this.push = push;
this.pop = pop;
this.peek = peek;
this.length=length;
this.clear=clear;
}
function push(element) {//进栈
this.dataStore[this.top++] = element;
}
function pop() {//出栈
return this.dataStore[--this.top];
}
function peek() {//栈顶元素
return this.dataStore[this.top-1];
}
function length() {
return this.top;
}
function clear() {
this.top = 0;
}
//测试栈的实现
var s= new Stack();
s.push("D");
s.push("R");
s.push("B");
console.log(s.length());
console.log(s.peek());
console.log(s.clear());
console.log(s.length());
问题3:找出数组中只出现一次的元素
function num(arr){
var str=arr.join('');
var res=[];
for(var i=0;i<str.length;i++){
var num=str.split(str[i]).length-1;
if(num===1){
res.push(str[i]);
}
}
return res;
}
var arr=[1,2,1,4,3,3];
console.log(num(arr));
问题4:现在对于给定的一个字符串s,请计算出字典序最大的s的子序列。
function max(str){
//字典序从小到大:abcdefg......
var arr=str.split('');
var res=[arr[arr.length-1]];//字符串最后一个元素肯定符合条件
for(var i=arr.length-2;i>=0;i--){//从倒数第二个元素开始,找单调递增的元素
if(arr[i]>=res[0]){
res.unshift(arr[i]);//找到符合的直接加入到res中
}
}
return res.join('');
}
var str='abddaa';
console.log(max(str));
问题5:判断树是否为对称树
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function isSymmetrical2(root1, root2){
if(root1 == null && root2 == null){
return true;
}
if(root1 == null || root2 == null){
return false;
}
if(root1.val != root2.val){
return false;
}
return isSymmetrical2(root1.left, root2.right) && isSymmetrical2(root1.right, root2.left);
}
function isSymmetrical(pRoot)
{
// write code here
return isSymmetrical2(pRoot, pRoot)
}
问题6:把一棵二叉树变成它的镜像二叉树
function Mirror(root){
if(root==null){//当一开始根节是空的时候,返回false
return false;
}
if(root.left ==null && root.right ==null){//当只有一个根节点时返回false
return false;
}
//第三种情况:当左右子树不为空的时候,交互左右子树节点
var temp=root.left;
root.left=root.right;
root.right=temp;
if(root.left!=null){//递归遍历左子树
Mirror(root.left);
}
if(root.right!=null){//递归遍历右子树
Mirror(root.right);
}
}
问题7:顺时针打印矩阵
function printMatrix(matrix)
{
// write code here
var row1 = 0;
var row2 = matrix.length-1;
var col1 = 0;
var col2 = matrix[0].length-1;
var rowflag = 1;
var colflag = 1;
var list=[];
while(row2>=row1 && col2>=col1){
if(rowflag == 1){
for(var i=col1; i<=col2; i++)
list.push(matrix[row1][i]);
row1++;
}
if(colflag == 1){
for(var i=row1; i<=row2; i++)
list.push(matrix[i][col2]);
col2--;
}
if(rowflag == -1){
for(var i=col2; i>=col1; i--)
list.push(matrix[row2][i]);
row2--;
}
if(colflag == -1){
for(var i=row2; i>=row1; i--)
list.push(matrix[i][col1]);
col1++;
}
rowflag = rowflag*(-1);
colflag = colflag*(-1);
}
return list;
}
问题8:Fibinacc数列
function Fibnacci(n){
var res=[0,1];
if(n<2){
return res[n];
}
var fib1=0;
var fib2=1;
var fibn=0;
for(var i=2;i<=n;i++){
fibn=fib1+fib2;
fib1=fib2;
fib2=fibn;
}
return fibn;
}
function jumpFloor(number)
{
if(number ===0){
return 0;
}
if(number===1){
return 1;
}
if(number ===2){
return 2;
}
var one = 1;
var two = 2;
var num = 0;
for(let i=3;i<=number;i++){
num = one + two;
one = two;
two = num;
}
return num
}
问题9:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
function Find(target, array) {
let i = 0;
let j = array[i].length - 1;
while (i < array.length && j >= 0) {
if (array[i][j] < target) {
i++;
} else if (array[i][j] > target) {
j--;
} else {
return true;
}
}
return false;
}
问题10:数组中出现次数超过一半的元素
function MoreThanHalfNum_Solution(numbers)
{
// write code here
if(numbers==null){
return null;
}
var string=numbers.join('');
var len=Math.floor(numbers.length/2);
for(var i=0;i<numbers.length;i++){
var num=string.split(numbers[i]).length-1;
if(num>len){
return numbers[i];
break;
}
}
return 0;
}
问题10:字符串全排列
function Permutation(str)
{
if(str === null || str === "")
return [];
var res = [];
var index = 0;
step(str.split(""), index, res);
return res.sort();
}
function step(strArr, cur, res) {
if(cur === strArr.length-1){
var i = 0, str = "";
while(i < strArr.length){
str += strArr[i++];
}
res.push(str);
}
for(var i = cur;i < strArr.length;i++) {
if(strArr[i] === strArr[cur] && i !== cur)
continue;
swap(strArr, i, cur);
step(strArr, cur+1, res);
swap(strArr, i, cur);
}
}
function swap(arr, a, b) {
var temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}