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

const linkList=new LinkList()
function LinkList(){
var Node=function(element){
this.element=element;
this.next=null
};
var length=;
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=;
while(node.next){
if(node.element===){
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=;
var head=null;
var tail=null;
}
LinkList.prototype.append=function(position,value){
if(position>-&&position<=length){
var node=new Node(element)
current=head;
previous,
index=;//标识插入位置
if(position==){
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 开头

->->
->
结果为:
->->
即:

下面上代码:

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=;
for(var i=;i<len;i++){
for(var j=;j<=i;j++){
if(i%j===){
flag++
}
}
if(flag==)
console.log(i);
flag=; } }
prime();

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

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

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

function addBigNumber(a,b){
var res="",
temp=;
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%)+res;
temp=temp>
}
return res.replace(/^+/, '');//+:匹配一次或多次
}
console.log(addBigNumber(,));

Javascript的算法题目的更多相关文章

  1. RX学习笔记:FreeCodeCamp的JavaScript基本算法挑战

    FreeCodeCamp的JavaScript基本算法挑战 https://www.freecodecamp.com 2016-07-03 JavaScript还不是非常熟悉,用已经会的知识来解这些题 ...

  2. Map the Debris -freecodecamp算法题目

    Map the Debris 1.要求 返回一个数组,其内容是把原数组中对应元素的平均海拔转换成其对应的轨道周期. 原数组中会包含格式化的对象内容,像这样 {name: 'name', avgAlt: ...

  3. Top Coder算法题目浏览器

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/top-code-offline-browser/ 关于 左耳朵耗子 ...

  4. 一道算法题目, 二行代码, Binary Tree

    June 8, 2015 我最喜欢的一道算法题目, 二行代码. 编程序需要很强的逻辑思维, 多问几个为什么, 可不可以简化.想一想, 二行代码, 五分钟就可以搞定; 2015年网上大家热议的 Home ...

  5. iOS面试中常见的算法题目

    一.前言 这里是在iOS求职中自己遇到的算法题,希望对大家有所帮助.不定期更新.如果大家想在线运行代码调试,可以将代码拷贝到这里.然后进行调试.下面就是常见的算法题目. 二.正文 1.就n的阶乘.(这 ...

  6. 【起】ACM类下为过往所做过的部分算法题目

    [起]ACM类下为过往所做过的部分算法题目 几百道题,日后细细品味.

  7. FCC的javascript初级算法题解答

    FCC上的javascript基础算法题 前一阵子做的基础算法题,感觉做完后收获还蛮大的,现在将自己的做法总结出来,供大家参考讨论.基本上做到尽量简短有效,但有些算法还可以继续简化,比如第七题若采用正 ...

  8. [优化]Steamroller-freecodecamp算法题目

    晚上在medium看到一篇关于找工作的文章,里面提到一个面试题目--flattening an array(扁平化数组).这我好像在哪看过!应该是freecodecamp里的算法某一题.翻了下博客记录 ...

  9. javascript 冒泡排序算法

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. ES6语法知识

    let/const(常用) let,const用于声明变量,用来替代老语法的var关键字,与var不同的是,let/const会创建一个块级作用域(通俗讲就是一个花括号内是一个新的作用域) 这里外部的 ...

  2. oracle-data-mining

    create user datamine identified by 123456 QUOTA UNLIMITED ON users; 然后在sqldeveloper工具界面-data miner中, ...

  3. nginx的白名单

    为nginx设置白名单的几个步骤:   第一步:指定能访问的白名单   vim /etc/nginx/ip.conf (如果在公司,记得这里是外网IP,要不然测很久都不知道为什么不行) ;   第二步 ...

  4. 迅雷磁力链接转BT种子工具

    种子文件目录:C:\Users\jifeng\AppData\Local\Temp\magnetex MagnetEx.exe 从迅雷5.8支持磁力链接的无视受限资源版提取 MagnetEx.exe ...

  5. 由override 和 overload 引发的学习感悟

    工作已三年的我,竟然面试的时候去裸考了.想当然的认为有很多东西会在工作中不知不觉积累下来,现在想想,真是扯淡... 我的三年的工作经验是开发测试的工作,主要负责测试用例的自动化实现,稍深一些的是自动化 ...

  6. Maya中提交Nuke工程到deadline中的方法

    在之前的一篇文中介绍了在maya中生成nuke工程脚本的方法,后来部门负责人希望更简单一些,能在那个功能面板里提交deadline农场渲染更好,这样就不用打开nuke手动提交了,省去了在两个软件直接来 ...

  7. 初识rt-thread

    bernard.xiong CEO 熊谱祥 env,提供编译构建环境.图形化系统配置及软件包管理功能 scons 是 RT-Thread 使用的编译构建工具,可以使用 scons 相关命令来编译 RT ...

  8. 6.ST LINK 下调试异常

    ☆1.无法进入main函数(printf的影响)***为什么有时候可以进入main函数,有什么进入不了main函数?    <1> 因为C语言默认使用显示器作为标准输出的设备,所以如果想利 ...

  9. weex Mac创建项目

    序言:本来在win 10 上创建项目真的很顺利!后来入手一个mac就从mac 上下载了最新的android studio开始搞起了weex,问题来了,weex-toolkit脚手架还是老的,我觉得是w ...

  10. postgresql分区(引用)

    1 建立大表.   2 创建分区继承   3 定义Rule或者Trigger? 1 建立大表        CREATE TABLE student (student_id bigserial, na ...