zoukankan      html  css  js  c++  java
  • 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));
  • 相关阅读:
    [USACO15FEB]Superbull 超级牛
    [SHOI2015]自动刷题机
    [BJOI2019]排兵布阵
    P3528 [POI2011]PAT-Sticks
    P3539 [POI2012]ROZ-Fibonacci Representation
    洛谷P1868 饥饿的奶牛
    洛谷P1462 通往奥格瑞玛的道路(SPFA+二分答案)
    [SDOI2008]山贼集团
    [SHOI2013]阶乘字符串
    30. 如何使用 GDB 调试 Go 程序?
  • 原文地址:https://www.cnblogs.com/yuan233/p/10366125.html
Copyright © 2011-2022 走看看