用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. Cache架构设计

    Cache策略 定时过期策略 定时过期的好处是Cache节点的个数符合实际需求,不会造成资源滥用和服务器压力 定时过期适合访问量较大,实时性要求不高的情况 如果访问量小,定时过期会造成Cache命中率 ...

  2. PythonStudy——Python 中Switch-Case 结构的实现

    学习Python过程中,发现Python没有Switch-case,过去写C习惯用Switch/Case语句,官方文档说通过if-elif实现.所以不妨自己来实现Switch-Case功能. 方法一 ...

  3. nginx添加一个站点

    server { listen ; server_name demo.abc.com ; root /Users/pa200318/demo.cp.com/trunk; index index.php ...

  4. 计算apk包的安装之后占用空间以及运行时占用内存

    1.统计结果如下 计算apk安装占用空间大小方式 为了方式apk包运行时出现缓存数据等对空间计算造成影响.应该先进行安装,然后分别计算空间变化 所有apk包安装完毕后再运行 开启两个cmd窗口 第一个 ...

  5. 第十四章 Java常用类

    14.常用类 14.1 字符串相关的类 1课时 14.2 JDK 8之前时间日期API 1课时 14.3 JDK8中新时间日期API 1课时 14.4 JDK8中的Optional类 1课时 14.5 ...

  6. .Net MVC TextBoxFor 扩展 placeholder 与 class 属性

    namespace System.Web.Mvc { public static class HtmlHelperExtensions { public static MvcHtmlString Bs ...

  7. Windows Azure Virtual Network (13) 跨数据中心之间的虚拟网络点对点连接VNet Peering

    <Windows Azure Platform 系列文章目录> 今天是大年初二,首先祝大家新年快乐,万事如意. 在笔者之前的文章中:Windows Azure Virtual Networ ...

  8. marathon 测试

    marathon 初步使用 关闭selinux setenforce 0 Marathon之应用篇 先来了解一下  Marathon 是怎么布署decker的 json shell.json { } ...

  9. html动态元素点击事件添加

    很多时候,页面的元素是后期异步动态添加在页面上.页面点击事件无效. 非动态的元素直接$().click();便可以直接触发点击事件,而动态元素需要事先注册事件. $(document).on('cli ...

  10. docker 批量删除

    杀死所有正在运行的容器docker kill $(docker ps -a -q) 删除所有已经停止的容器docker rm $(docker ps -a -q) 删除所有未打 dangling 标签 ...