Javascript的算法题目

用js实现单链表的增删,直接上代码

const linkList=new LinkList()
function LinkList(){
    var Node=function(element){
        this.element=element;
        this.next=null
    };
var length=0;
var head=null;
}
   LinkList.prototype.append=function(value){
    var node=new Node()
    var current;
    if(head==null){
        head=node;
    }
    else{
        while(current.next){
            current=current.next
        }
        current.next=node;
    }
    length++;
   }
//向链表头的下一个位置添加元素
LinkList.prototype.prepend=function(value){
        var node=new Node(value);
        current=head;
    node.next=current;
    head=node;
}
LinkList.prototype.delete=function(value){
    var node=new Node();
    var cnt=0;
    while(node.next){
       if(node.element===2){
           var p=node.next
           node.next=p.next
           p.next=node
           cnt++
       }
    }
    return cnt;
}
LinkList.prototype.reverse=function(value){
    current=head;
    var p;//当前的下一个node
    var q=null;

while(current){
    p=current.next
    current.next=q;
    q=current;
    current=p;
}
}

以上是单链表的一些功能,下面是双链表的功能:

function LinkList(){
    var Node=function(element){
        this.element=element;
        this.next=null;
        this.prev=null;
    }
    var length=0;
    var head=null;
    var tail=null;
}
LinkList.prototype.append=function(position,value){
    if(position>-1&&position<=length){
        var node=new Node(element)
        current=head;
        previous,
        index=0;//标识插入位置
        if(position==0){
        head=node;
        node.next=current;
        current.prev=node;
        }
        else if(position==length){
            tail.next=node;
            node.prev=tail;
            node.next=null;
        }
        else{
         while(index++<position){
             previous=current;
             current=current.next;
         }
         node.next=current;
         previous.next=node;
         node.pre=previous;
         current.prev=node;
        }
    }
    length++;
}

LinkList.prototype.delete=function(value){
     current=head;
    while(current.next){
        if(current.element===value){
            current.prev=current.next
            current.next.prev=current.prev
            current=current.next;
        }
        current=current.next; 
          length--
    }
}

Js实现随机洗牌算法

 采用著名的“Fisher–Yates”的算法

算法流程:

  1. 需要随机置乱的n个元素的数组a
  2. 从0到n开始循环,循环变量为i
  3. 生成随机数K,K为0到n之间的随机数
  4. 交换i位和K位的值

js实现:

  var a=[0,1,2,3,4,5,6,7,8,9];
      function p(a){
          var k=0;
          var tmp=0;
          for(var i=0;i<a.length;i++){
              k=Math.floor(Math.random()*(10))//生成0-9的随机数
              tmp=a[k];
              a[k]=a[i];
              a[i]=tmp;
          }
      }

//这里补充,生成随机数的js代码,包含上/下限:
k=Math.floor(Math.random()*(up-low+1)+low

输入年月日,判断该日是这年的第几天?

    function isRun(a) {
        return a % 4 == 0 
    }
    function daysNum(year,month,day){
     var months=[31,28,31,30,31,30,31,31,30,31,30,31];
     if(month===1){
         return day;
     }
       else{
          for(var i=0;i<month;i++){
             day+=months[i];
             if(isRun(year)&&month>2){
             day++;
             }
         } 
       }
       return day;  
    }

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头

4->2->5
8->4
结果为:
2->7->5
即:572

下面上代码:

function ListNode(val){
this.val=val;
this.next=null;
}

var addTwoNumbers = function(l1, l2) {
let carry=0;
let arr=[];
let sum=0;
while(l1||l2){
let a=l1?l1.val:null;
let b=l2?l2.val:null;
let sum=a+b+carry;
arr.push(sum%10);
if(parseInt(sum/10)){
carry=1
}
l1=l1?l1.next:null;
l2=l2?l2.next:null;
}
if(parseInt(sum/10)){
arr.push(parseInt(sum/10))
}
var res=new ListNode(0);
var tmp=res.next=new ListNode(0);
for(var i=0;i<arr.length;i++){
tmp=tmp.next=new ListNode(0);
tmp.val=arr[i]
}return res.next.next;
while(l1||l2){
let a=l1?l1.val:null;
let b=l2?l2.val:null;
let sum=a+b+carry;
arr.push(sum%10);
if(parseInt(sum/10)){
carry=1
}
l1=l1?l1.next:null;
l2=l2?l2.next:null;
}
if(parseInt(sum/10)){
arr.push(parseInt(sum/10))
}
var res=new ListNode(0);
var tmp=res.next=new ListNode(0);
for(var i=0;i<arr.length;i++){
tmp=tmp.next=new ListNode(0);
tmp.val=arr[i]
}return res.next.next;
};

 找字符串中出现次数最多的字母?

 function findMax(str){
     var obj={};
     var tmp=str.split('')
     for(var i=0;i<tmp.length;i++){
         if(obj[tmp[i]]){
             obj[tmp[i]]++;
         }
         else{
             obj[tmp[i]]=1;
         }
     }
     var maxTime=0;
     var key='';
     for(var value in obj){
         if(maxTime<obj[value]){
              maxTime=obj[value];
              key=value;
         }
     }
     console.log("maxvalue is:"+key+";maxTime is:"+maxTime);
     console.log(obj);
 }

 整数的逆序,超过32位溢出,则输出为0

var reverse = function(x) {
    var num=x.toString();
     var num1=parseInt(num.split('').reverse().join(''));

    if(num1>Math.pow(2, 31) - 1 || num1 < -Math.pow(2, 31))
        return 0
    else
        return num1
};

 找字符串中最长的回文子串

 function findLong(str){
     let now='';
     let tmp='';
     for(let i=0;i<str.length;i++){
         tmp='';
         for(let j=i;j<str.length;j++){
             tmp+=str.charAt(j);
             if(isLong(tmp)&&tmp.length>now.length){
                 now=tmp;
             }
         }
     }return now
 }
 function isLong(s) {
     return s===s.split('').reverse().join('');
 }

 求1000以内的质数

算法思想是:质数只能被1和自身整除,设置一个哨兵,从0开始,当哨兵的值等于2时,输出这个数
function prime(len){
         var flag=0;
            for(var i=1;i<len;i++){
                for(var j=1;j<=i;j++){
                     if(i%j===0){
                 flag++
                } 
                }
              if(flag==2)
              console.log(i);
           flag=0;   }
          
        }
        prime(1000);

 已知一个全部为数字的数组,比如[2,3,5,2,3,2,2,2,54],其中某个数字出现的次数超过数组长度的一半,求出该数字;

function findNum(arr){
    let obj={};
    for(let i=0;i<arr.length;i++){
        if(obj[arr[i]]){
            obj[arr[i]]++;
        }
        else{
            obj[arr[i]]=1;
        }
    }
    console.log(obj);
    for(var value in obj){
        if(obj[value]>(arr.length)/2)
       {
          return value; 
       } 
    }
    return false;
   }
  let a=findNum([1,3,3,3,3,2]);
   console.log(a);
   

实现两个大数相加(利用了js的字符串不会溢出)

function addBigNumber(a,b){
    var res="",
    temp=0;
    a=a.toString();
    b=b.toString();
    a=a.split('');
    b=b.split('');
    while(a.length||b.length||temp){
        temp+=~~a.pop()+~~b.pop();
        res=(temp%10)+res;
        temp=temp>9
    }
    return res.replace(/^0+/, '');//+:匹配一次或多次
}
console.log(addBigNumber(1000000000000,239887678900077666789900));

 

posted on 2019-02-12 17:32  袁233  阅读(333)  评论(0编辑  收藏  举报

导航