数据结构与算法JavaScript 学习

发布于:2020-02-15 21:53:52

一、 JavaScript中的算术运算和数学库函数

1.if-else if 语句


var mid = 25;

var high = 50;

var low = 1;

var current = 13;

var found = -1;

if (current < mid) {

mid = (current-low) / 2;

}

else if (current > mid) {

mid = (current+high) / 2;

}

else {

found = current;

}


2.switch 语句


= "February";

break;

case "3":

monthName = "March";

break;

case "4":

monthName = "April";

break;

case "5":

monthName = "May";

break;

case "6":

monthName = "June";

break;

case "7":

monthName = "July";

break;

case "8":

monthName = "August";

break;

case "9":

monthName = "September";

break;

6 | 第1 章

case "10":

monthName = "October";

break;

case "11":

monthName = "November";

break;

case "12":

monthName = "December";

break;

default:

print("Bad input");

}


3 循环结构

(1) while 循环

var number = 1;

var sum = 0;

while (number < 11) {

sum += number;

++number;

}

console.log(sum);


(2) 使用for 循环求和


var number = 1;

var sum = 0;

for (var number = 1; number < 11; number++) {

sum += number;

}

console.log(sum); // 显示55


(3)使用for 循环访问数组

var numbers = [3, 7, 12, 22, 100];

var sum = 0;

for (var i = 0; i < numbers.length; ++i) {

sum += numbers[i];

}

console.log(sum); // 显示144



二、函数

(1)有返回值的函数

function factorial(number) {

var product = 1;

for (var i = number; i >= 1; --i) {

product *= i;

}

return product;

}

print(factorial(4)); // 显示24

print(factorial(5)); // 显示120

print(factorial(10)); // 显示3 628 800


(2)JavaScript 中的子程或者void 函数

function curve(arr, amount) {

for (var i = 0; i < arr.length; ++i) {

arr[i] += amount;

}

}

var grades = [77, 73, 74, 81, 90];

curve(grades, 5);

print(grades); // 显示82,78,79,86,95


(3) 递归


function  factorial(number){

    if(number==1){

        return number;

    }else{

        return number * factorial(number-1);

    }

}

console.log(factorial(5));

输出

fac712d219b23aa3246894a9438aad92.png



三、数组

  1. 创建数组

(1).var numbers = [];

(2).var numbers = new Array();

console.log(numbers.length); // 显示0


可以调用Array.isArray() 来判断一个对象是否是数组,如下所示:

var numbers = 3;

var arr = [7,4,1776];

print(Array.isArray(numbers)); // 显示false

print(Array.isArray(arr)); // 显示true


2.读写数组


在一条赋值语句中,可以使用[] 操作符将数据赋给数组,比如下面的循环,将1~100 的

数字赋给一个数组:

var nums = [];

for (var i = 0; i < 100; ++i) {

nums[i] = i+1;

}

还可以使用[] 操作符读取数组中的元素,如下所示:

var numbers = [1,2,3,4,5];

var sum = numbers[0] + numbers[1] + numbers[2] + numbers[3] +

numbers[4];

print(sum); // 显示15

如果要依次读取数组中的所有元素,使用for 循环无疑会更简单:

var numbers = [1,2,3,5,8,13,21];

var sum = 0;

for (var i = 0; i < numbers.length; ++i) {

sum += numbers[i];

}

print(sum); // 显示53


3.由字符串生成数组 split() 方法使用


var sentence = "the quick brown fox jumped over the lazy dog";

var words = sentence.split(" ");

for (var i = 0; i < words.length; ++i) {

    console.log("word " + i + ": " + words[i]);

}


该程序的输出为:

word 0: the

word 1: quick

word 2: brown

16 | 第2 章

word 3: fox

word 4: jumped

word 5: over

word 6: the

word 7: lazy

word 8: dog


4.查找元素indexOf() 函数的使用

<script type="text/javascript">

var str="Hello world!"
document.write(str.indexOf("Hello") + "<br />")
document.write(str.indexOf("World") + "<br />")
document.write(str.indexOf("world"))

</script>


以上代码的输出:

0
-1
6



5.数组的字符串表示:(有两个方法可以将数组转化为字符串,join() 和toString())


var names = ["David", "Cynthia", "Raymond", "Clayton", "Mike", "Jennifer"];

var namestr = names.join();

console.log(namestr); // David,Cynthia,Raymond,Clayton,Mike,Jennifer

namestr = names.toString();

console.log(namestr); // David,Cynthia,Raymond,Clayton,Mike,Jennifer



6.由已有数组创建新数组:  合并数组 concat(),方法截取一个数组的子集创建一个新数组splice() 。

var cisDept = ["Mike", "Clayton", "Terrill", "Danny", "Jennifer"];

var dmpDept = ["Raymond", "Cynthia", "Bryan"];

var itDiv = cis.concat(dmp);

console(itDiv);

itDiv = dmp.concat(cisDept);

console(itDiv);


输出为:

Mike,Clayton,Terrill,Danny,Jennifer,Raymond,Cynthia,Bryan

Raymond,Cynthia,Bryan,Mike,Clayton,Terrill,Danny,Jennifer


7.为数组添加元素 push(),unshift()

var nums = [1,2,3,4,5];

console.log(nums); // 1,2,3,4,5

nums.push(6);

console.log(nums); // 1,2,3,4,5,6


8.unshift() 方法可以将元素添加在数组的开头


var nums = [2,3,4,5];

console.log(nums); // 2,3,4,5


var newnum = 1;

nums.unshift(newnum);

console.log(nums); // 1,2,3,4,5


nums = [3,4,5];

nums.unshift(newnum,1,2);

console.log(nums); // 1,2,3,4,5


9.从数组中删除元素

(1)使用pop() 方法可以删除数组末尾的元素:

var nums = [1,2,3,4,5,9];

nums.pop();  

console.log(nums); // 1,2,3,4,5  删除数组末尾的元素9


(2)shift() 方法可以删除数组的第一个元素


var nums = [9,1,2,3,4,5];

nums.shift();

console.log(nums); // 1,2,3,4,5  删除数组的第一个元素9


(3)从数组中间位置添加和删除元素splice()

使用splice() 方法为数组添加元素,需提供如下参数:

起始

• 索引(也就是你希望开始添加元素的地方);

• 需要删除的元素个数(添加元素时该参数设为 0);

• 想要添加进数组的元素。


var nums = [1,2,3,7,8,9];

var newElements = [4,5,6];

nums.splice(3,0,newElements);

console.log(nums); // 1,2,3,4,5,6,7,8,9


看一个简单的例子。下面的程序在数组中间插入元素:

var nums = [1,2,3,7,8,9];

var newElements = [4,5,6];

nums.splice(3,0,newElements);

console.log(nums); // 1,2,3,4,5,6,7,8,9


下面是使用splice() 方法从数组中删除元素的例子:

var nums = [1,2,3,100,200,300,400,4,5];

nums.splice(3,4);

print(nums); // 1,2,3,4,5



9.为数组排序

(1)reverse() 数组排序翻转

var nums = [1,2,3,4,5];

nums.reverse();

print(nums); // 5,4,3,2,1


(2)sort() 数组进行排序字母排序

var names = ["David","Mike","Cynthia","Clayton","Bryan","Raymond"];

names.sort();

print(names); // Bryan,Clayton,Cynthia,David,Mike,Raymond


将这些搞清楚之后,传入一个大小比较函数,再来看看前面的例子:

function compare(num1, num2) {

return num1 - num2;

}

var nums = [3,1,2,100,4,200];

nums.sort(compare);

print(nums); // 1,2,3,4,100,200


10.迭代器方法

10.1 不生成新数组的迭代器方法

10.1.1 forEach()

我们要讨论的第一组迭代器方法不产生任何新数组,相反,它们要么对于数组中的每个元

素执行某种操作,要么返回一个值。

这组中的第一个方法是forEach(),该方法接受一个函数作为参数,对数组中的每个元素

使用该函数。下面这个例子展示了如何使用该方法:

function square(num) {

console.log(num, num * num);

}

var nums = [1,2,3,4,5,6,7,8,9,10];

nums.forEach(square);

该程序的输出为:

1 1

2 4

3 9

4 16

5 25

6 36

7 49

8 64

9 81

10 100


10.1.2 every()


isEven(num) {

return num % 2 == 0;

}

var nums = [2,4,6,8,10];

var even = nums.every(isEven);

if (even) {

print("all numbers are even");

}

else {

print("not all numbers are even");

}

输出为:

all numbers are even

将数组改为:

var nums = [2,4,6,7,8,10];

输出为:

not all numbers are even


10.1.3 some() 

some() 方法也接受一个返回值为布尔类型的函数,只要有一个元素使得该函数返回true,

该方法就返回true。比如:

function isEven(num) {

return num % 2 == 0;

}

var nums = [1,2,3,4,5,6,7,8,9,10];

var someEven = nums.some(isEven);


if (someEven) {

print("some numbers are even");

}

else {

print("no numbers are even");

}

nums = [1,3,5,7,9];

someEven = nums.some(isEven);

if (someEven) {

print("some numbers are even");

}

else {

print("no numbers are even");

}

该程序的输出为:

some numbers are even

no numbers are even

reduce() 方法接受一个函数,返回一个值。该方法会从一个累加值开始,不断对累加值和

数组中的后续元素调用该函数,直到数组中的最后一个元素,最后返回得到的累加值。下

面这个例子展示了如何使用reduce() 方法为数组中的元素求和:

function add(runningTotal, currentValue) {

return runningTotal + currentValue;

}

var nums = [1,2,3,4,5,6,7,8,9,10];

var sum = nums.reduce(add);

print(sum); // 显示55

reduce() 方法和add() 函数一起,从左到右,依次对数组中的元素求和,其执行过程如下

所示:

add(1,2) -> 3

add(3,3) -> 6

add(6,4) -> 10

add(10,5) -> 15

add(15,6) -> 21

add(21,7) -> 28

add(28,8) -> 36

add(36,9) -> 45

add(45,10) -> 55



10.1.4 reduce() 

reduce() 方法也可以用来将数组中的元素连接成一个长的字符串:

function concat(accumulatedString, item) {

return accumulatedString + item;

}

var words = ["the ", "quick ","brown ", "fox "];

数组 | 25

var sentence = words.reduce(concat);

print(sentence); // 显示 "the quick brown fox"

JavaScript 还提供了reduceRight() 方法,和reduce() 方法不同,它是从右到左执行。下面

的程序使用reduceRight() 方法将数组中的元素进行翻转:

function concat(accumulatedString, item) {

return accumulatedString + item;

}

var words = ["the ", "quick ","brown ", "fox "];

var sentence = words.reduceRight(concat);

print(sentence); // 显示 "fox brown quick the"




10.2 生成新数组的迭代器方法

= grades.map(curve);

print(newgrades); // 82, 70, 86, 97, 88

下面是对一个字符串数组使用map() 方法的例子:

function first(word) {

return word[0];

}

var words = ["for","your","information"];

var acronym = words.map(first);

print(acronym.join("")); // 显示"fyi"

在上面这个例子中,数组acronym 保存了数组words 中每个元素的第一个字母。然而,如

果想将数组显示为真正的缩略形式,必须想办法除掉连接每个数组元素的逗号,如果直接

调用toString() 方法,就会显示出这个逗号。使用join() 方法,为其传入一个空字符串

作为参数,则可以帮助我们解决这个问题。

filter() 和every() 类似,传入一个返回值为布尔类型的函数。和every() 方法不同的是,

当对数组中的所有元素应用该函数,结果均为true 时,该方法并不返回true,而是返回

一个新数组,该数组包含应用该函数后结果为true 的元素。下面是一个例子:

function isEven(num) {

return num % 2 == 0;

}

function isOdd(num) {

return num % 2 != 0;

}

var nums = [];

for (var i = 0; i < 20; ++i) {

nums[i] = i+1;

}

var evens = nums.filter(isEven);

print("Even numbers: ");

print(evens);

var odds = nums.filter(isOdd);

print("Odd numbers: ");

print(odds);

该程序的执行结果如下:

Even numbers:

2,4,6,8,10,12,14,16,18,20

Odd numbers:

1,3,5,7,9,11,13,15,17,19

下面是另一个使用filter() 方法的有趣案例:

function passing(num) {

return num >= 60;

}

var grades = [];

for (var i = 0; i < 20; ++i) {

grades[i] = Math.floor(Math.random() * 101);

}

var passGrades = grades.filter(passing);

print("All grades: );

print(grades);

print("Passing grades: ");

print(passGrades);

程序显示:

All grades:

39,43,89,19,46,54,48,5,13,31,27,95,62,64,35,75,79,88,73,74

Passing grades:

89,95,62,64,75,79,88,73,74

当然,还可以使用filter() 方法过滤字符串数组,下面这个例子过滤掉了那些不包含

“cie”的单词:

function afterc(str) {

数组 | 27

if (str.indexOf("cie") > -1) {

return true;

}

return false;

}

var words = ["recieve","deceive","percieve","deceit","concieve"];

var misspelled = words.filter(afterc);

print(misspelled); // 显示recieve,percieve,concieve


阅读 704+

一片空白

父爱如山,不善表达。回想十多年前,总记得父亲有个宽厚的肩膀,小小的自己跨坐在上面,越过人山人海去看更广阔的天空,那个时候期望自己有一双翅膀,能够像鸟儿一样飞得高,看得远。虽然父亲有时会和自己开玩笑,但在做错事的时候会受到严厉的训斥。父亲有双粗糙的大手掌。