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”的算法
算法流程:
- 需要随机置乱的n个元素的数组a
- 从0到n开始循环,循环变量为i
- 生成随机数K,K为0到n之间的随机数
- 交换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));