数据结构与算法的JS描述

数据结构与算法的JS描述

1.1

//switch语句
//putstr 输入
putstr("Enter a month number: ");
//readline()读取输入,返回字符串
var monthNum = readline();
var monthName;
switch(monthNum){
	case "1":
		monthName = "January";
		break;
	case "2":
		monthName = "February";
		break;
	case "3":
		monthName = "March";
		break;
	case "4":
		monthName = "April";
		break;
	case "5":
		monthName = "May";
		break;
	case "6":
		monthName = "June";
	case "7":
		monthName = "July";
		break;
	case "8":
		monthName = "August";
		break;
	case "9":
		monthName = "September";
		break;
	case "10":
		monthName = "October";
		break;
	case "11":
		monthNmae = "November";
		break;
	case "12":
		monthName = "December";
	default:
	print("Bad input");
}
print(monthName);
//1到10求和
//while
var n = 1;
var sum = 0;
while(n<11){
	sum += n;
	n++;
}
print(sum);//55

//for
var sum = 0;
for(var i=1; i<11; i++){
	sum+=i;
}
print(sum);//55

//for 访问数组
var arr=[1,2,3,4,5];
var sum = 0;
for(var i=0; i<arr.length; i++){
	sum += arr[i];
}
print(sum);//15
//函数
//有返回值||无返回值(有时叫子程/void函数)
//阶乘
function factorial(num){
	var product = 1;
	for(var i=num; i>0; i--){
		product *= i;
	}
	return product;
}
print(factorial(10));//3 628 800

//对数组每项加一个数,且对修改后的数组求和
var sum = 0;
function curve(arr, amount){
	for(var i=0; i<arr.length; i++){
		arr[i] += amount;
		sum += arr[i];
	}
}
var grades = [77, 80, 85, 90, 95];
curve(grades, 5);
print(grades,sum);//82,85,90,95,100 452
//1.2.6 变量作用域
//一个变量在程序的哪些地方可以访问
//全局作用域 || 局部作用域
function  showSco(){
	return scope;
}
var scope = "global";
print(scope); //global
print(showSco()); //global

function showScope(){
	var scope = "local";
	return scope;
}
var scope = "global";

print(scope);	//global
print(showScope()); //local
//1.2.7 递归
//任何可被递归定义的函数都可改写为迭代式的程序
function factorial(num){
	if(num <=1){
		return num;
	}else{
		return num*arguments.callee(num-1);
	}
}

print(factorial(5));

//严格模式下
var factorial = (function func(num){
	if(num<=1){
		return num;
	}else{
		return num * func(num-1);
	}
})
var another= factorial;
factorial = null;
print(another(5));
//1.3 对象和面向对象编程
//this将方法和属性绑定到一个对象实例上
function Checking(amount){
	this.balance = amount;
	this.deposit = deposit;
	this.withdraw = withdraw;
	this.toString = toString;
}

function deposit(amount){
	this.balance += amount;
}

function withdraw(amount){
	if(amount<=this.balance){
		this.balance-=amount;
	}
	if(amount>this.balance){
		print("Insufficient funds");
		this.balance-=amount;
	}
}

function toString(){
	return "Balance: "+this.balance;
}

var account = new Checking(500);
account.deposit(1000);	//存款1000
print(account.toString());
account.withdraw(750);	//提现750
print(account.toString());
account.withdraw(800); //资金不足
print(account.toString()); 

2.数组

//数组的标准定义:一个存储元素的线性集合
//元素可通过索引任意存取,用来计算元素之间存储位置的偏移量

//js中,数组表示偏移量的索引是该对象的属性,JS中属性名必须为字符串,索引为整数时数组内部自动转换

//Array.isArray(obj);

var nums = [];
for(var i=0; i<100; i++){
	nums[i] = i+1;
}

//split

var sentence = "the quick brown fox jumped over the lazy dog";
var words = sentence.split(" ");
for(var i=0; i<words.length; i++){
	print("word" + i +": " + words[i]);
}

//浅拷贝 新数组指向原来的数组
//深拷贝 复制原数组中的每一个值到新数组

//浅拷贝
var nums = [];
for (var i=0; i<100; i++){
	nums[i] = i+1;
}
var samenums = nums;//浅拷贝与nums[0]同
nums[0]=100;
print(samenums[0]);

//深拷贝
function copy(arr1, arr2){
	for(var i=0; i<arr1.length; i++){
		arr2[i] = arr1[i];
	}
}

var nums = [];
for (var i=0; i<100; i++){
	nums[i] = i+1;
}
var samenums = [];
copy(nums, samenums); //使用深拷贝
nums[0]=100;
print(samenums[0]);//数组互不影响,浅拷贝会有影响


//访问数组整体
nums=[1,2,3,4,5];
print(nums);
//存取函数
//indexOf()返回第一个索引 lastIndexOf()返回最后一个索引
var names = ["AAA", "DDD", "BBB", "CCC", "DDD", "EEE"];
putstr("Enter a name to search for:");
var name = readline();
var firstpos = names.indexOf(name);
var lastpos = names.lastIndexOf(name)
// if(firstpos >= 0){
// 	print("Found "+name+" at position "+firstpos);
// }else{
// 	print(name+" not found in array.");
// }

print("First found "+name+" at position "+firstpos);
print("Last found "+name+" at position "+lastpos);
//2.3.2 数组的字符串表示
//join() toString()返回字符串,元素以逗号隔开
var names = ["Niklaus", "Caroline", "Lexi", "Kai", "Kol"];
var namestr = names.join('+');//默认以逗号隔开,可指定字符
print(namestr);
namestr = names.toString();
print(namestr);

//由已有数组创建新数组
//concat()合并 
//splice(start,length,插入或删除的项)截取
//splice()length 为0是插入, 大于0删除,返回删除项,有第三个参数会插入数组
var arr1=["A", "B", "C", "D"];
var arr2=[1, 2, 3];
var newArr = arr1.concat(arr2);
print(newArr);

var spliceArr = arr1.splice(1,0,"red","black");//插入
print(arr1);//A,red,black,B,C,D
print(spliceArr);//空

var splicearr = arr1.splice(2,1,"E","F");//删除并插入
print(arr1);	//A,red,E,F,B,C,D
print(splicearr);	//black返回删除项

splice(start,length,插入或删除的项)截取
length 为0是插入,(大于0删除,返回删除项),有第三个参数会插入数组

//为数组添加元素
//push()尾 unshift()首
//删除数组元素
//pop() shift()
//unshift()实现法
var nums = [2,3,4,5];
var newnum = 1;
var N = nums.length;
for(var i=N; i>0; i--){
	nums[i]=nums[i-1];//把前一项给到后一项
}
nums[0] = newnum;
print(nums);

//shift()实现方法
var nums = [6,1,2,3,4];
for(var i=0; i<nums.length; i++){
	nums[i]=nums[i+1];//元素前移一位
}
print(nums);//1,2,3,4, 多出了一个逗号
print(nums.length);//5,长度不变,最后一个元素为undefined
//为数组排序
//reverse()反转
//sort()按字典顺序排序

var nums = [3,1,2,100,4,200];
nums.sort();
print(nums);//1,100,2,200,3,4

//如何实现数字数组排序
function compare(num1, num2){
	return num1-num2;
}
nums.sort(compare);//传入compare参数
print(nums);//1,2,3,4,100,200

不产生新数组 数组的迭代器方法



//forEach() every()
//forEach()接收一个函数作为参数,对数组中每个元素执行该操作

//every()该方法接受一个返回值为布尔类型的参数,对数组中每个元素只I型那个该函数
//如果所有元素应用该函数均返回true,则every()返回true

//some()同every(),但存在则返回true

//reduce() 接收一个函数,返回一个值,该方法从一个累加值开始,
//不断对累加值和数组中的后续元素调用该函数,直到遇到数组的最后一个元素,返回累加值
//reduceRight()从右向左执行
function square(num){
	print(num, num*num);
}
var nums = [1,2,3,4,5,6,7];
nums.forEach(square);//换行输出结果 forEach()
// 1 1
// 2 4
// 3 9
// 4 16
// 5 25
// 6 36
// 7 49

function isEven(num){
	return num%2 ==0;
}
var even = nums.every(isEven);	//every()
if(even){
	print("all numbers are even");
}else{
	print("not all numbers are even");
}

var someEven = nums.some(isEven);	//some()
if(someEven){
	print("exists numbers are even");
}else{
	print("no numbers are even");
}

//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);				//reduce()
print(sum);//55

//用reduce连接字符串
function concat(accumulateString, item){
	return accumulateString + item;
}
var words = ["the ", "quick ", "brown ", "fox "];
var sentence = words.reduce(concat);			//reduce()
var sentenceRight = words.reduceRight(concat);	//reduceRight()
print(sentence);//the quick brown fox
print(sentenceRight);//fox brown quick the

产生新数组的迭代器方法

//生成新数组的迭代器方法
//map() filter()
//map()对数组的每一项进行操作,然后返回一的新的数组
//该数组是对原有数组应用某个函数得到的结果,参数为函数名

//filter()传入一个返回值为布尔型的函数,当数组中所有元素应用该函数
//结果均为true时,返回一个新数组,新数组包含所有为true的元素

//map()
function curve(grade){
	return grade+=5;
}
var grades = [1,2,3,4,5];
var newgrades = grades.map(curve);
print(newgrades);	

function first(word){
	return word[0];//取word第一项
}
var words = ["for","your","information"];
var acronym = words.map(first);
print(acronym.join("")); //fyi

//filter()
function isEven(num){
	return num%2 == 0;//索引为偶数
}
function idOdd(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: ", evens);//Even numbers:  2,4,6,8,10,12,14,16,18,20

var odds = nums.filter(idOdd);//Odd numbers:  1,3,5,7,9,11,13,15,17,19
print("Odd numbers: ",odds);

//Another ex of filter
var grades = [];
for(var i=0; i<20; i++){
	grades[i] = Math.floor(Math.random()*101);//1到100的随机数
}
function passing(num){
	return num>=60;
}

//筛选随机数中大于60的数
var passGrades = grades.filter(passing);

print("All grades: ", grades);//All grades:  63,74,53,29,58,57,90,34,52,79,45,10,36,1,81,11,48,7,43,58
print("Passing grades: ", passGrades);//Passing grades:  63,74,90,79,81

//使用filter过滤字符串,查找含有cie的字符
function afterc(str){
	if(str.indexOf("cie")>-1){
		return true;
	}else{
		return false;
	}
}

var words = ["receive", "deceive", "percieve", "deceit", "concieve"];
var misspelled = words.filter(afterc);
print(misspelled);//percieve,concieve
//二维和多维数组
//JS只支持一维数组,通过在数组里保存数组元素创建多维数组
Array.matrix = function(numrows, numcols, initial){
	var arr = [];
	for(var i=0; i<numrows; i++){
		var columns = [];
		for(var j=0; j<numcols; j++){
			columns[j] = initial;
		}
		arr[i] = columns;
	}
	return arr;
}

var nums = Array.matrix(5,5,0);
print(nums[0][0]);



//访问二维数组
//按列
var grades = [[89, 77],[76, 82, 81, 78],[91, 94, 89]];
print(grades[2][2]);//89
var total = 0;
var average = 0.0;
for(var row = 0; row<grades.length; row++){//行长
	for(var col=0; col<grades[row].length; col++){//列长
		total += grades[row][col];
	}
	average = total/grades[row].length;
	print("Student "+parseInt(row+1)+" average:"+average.toFixed(2));
	total = 0;
	average = 0.0;
}
// Student 1 average:83.00
// Student 2 average:79.25
// Student 3 average:91.33

//对象数组
function Point(x, y){
	this.x = x;
	this.y = y;
}
function displayPts(arr){
	for(var i=0; i<arr.length; i++){
		print(arr[i].x +","+arr[i].y);
	}
}

var p1 = new Point(1,2);
var p2 = new Point(3,5);
var p3 = new Point(2,8);
var p4 = new Point(4,4);
print(p1.x,p2.x,p3.y,p4); //1 3 8 [object Object]

var points = [p1,p2,p3,p4];
for(var i=0; i<points.length; i++){
	print("Point"+parseInt(i+1)+": "+points[i].x+", "+points[i].y);
}

var p5 = new Point(12, -3);
points.push(p5);
print("After push: ");
displayPts(points);
points.shift();
print("After shift: ");
displayPts(points);
// Point1: 1, 2
// Point2: 3, 5
// Point3: 2, 8
// Point4: 4, 4
// After push:
// 1,2
// 3,5
// 2,8
// 4,4
// 12,-3
// After shift:
// 3,5
// 2,8
// 4,4
// 12,-3

对象中的数组

//对象中的数组
function weekTemps(){
	this.dataStore = [];
	this.add = add;	//给对象添加方法增加元素
	this.average = average;	//给对象计算平均数
}

function add(temp){
	this.dataStore.push(temp);	//给对象的数组加值
}

function average(){
	var total = 0;
	for(var i=0; i<this.dataStore.length; i++){
		total += this.dataStore[i];
	}
	return total/this.dataStore.length;
}

var thisWeek = new weekTemps();
thisWeek.add(52);
thisWeek.add(55);
thisWeek.add(61);
thisWeek.add(65);
thisWeek.add(55);
thisWeek.add(50);
print(thisWeek.average().toFixed(2));//保留两位小数 56.33
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值