行者无疆 始于足下 - 行走,思考,在路上
w3cschool javascript 笔记(1)
Javascript 教程
Table of Contents
- 1 简介
- 2 如何实现JavaScript
- 3 把JavaScript放置到何处
- 4 JavaScript语句
- 5 JavaScript注释
- 6 JavaScript变量
- 7 JavaScript运算符
- 8 JavaScript比较和逻辑运算符
- 9 JavaScript If…Else语句
- 10 JavaScript消息框
- 11 JavaScript函数
- 12 JavaScript For循环
- 13 JavaScript While循环
- 14 JavaScript Break和Continue语句
- 15 JavaScript事件
- 16 JavaScript Try…Catch语句
- 17 JavaScript特殊字符
- 18 JavaScript指导方针
- 19 JavaScript对象简介
- 20 JavaScript字符串(String)对象
- 21 JavaScript Date(日期)对象
- 22 JavaScript数组
- 23 JavaScript Boolean(逻辑)对象
- 24 JavaScript Math(算数)对象
- 25 JavaScript HTML DOM对象
1 简介
1.1 什么是Javascript
- JavaScript被设计用来向HTML页面添加交互行为。
- JavaScript是一种脚本语言(脚本语言是一种轻量级的编程语言)。
- JavaScript由数行可执行计算机代码组成。
- JavaScript通常被直接嵌入 HTML 页面。
- JavaScript是一种解释性语言(就是说,代码执行不进行预编译)。
- 所有的人无需购买许可证均可使用JavaScript。
1.2 真实的名称是ECMAScript
- JavaScript的正式名称是"ECMAScript"。这个标准由ECMA组织发展和维护。
- ECMA-262是正式的JavaScript标准。这个标准基于JavaScript(Netscape)和JScript(Microsoft)。
- Netscape(Navigator 2.0)的Brendan Eich发明了这门语言,从1996年开始,已经出现在所有的Netscape和Microsoft浏览器中。
- ECMA-262的开发始于1996年,在1997年7月,ECMA会员大会采纳了它的首个版本。
- 在1998年,该标准成为了国际ISO标准(ISO/IEC 16262)。
- 这个标准仍然处于发展之中。
2 如何实现JavaScript
- <script>标签嵌入JavaScript
-
与老的浏览器打交道:
<html> <body> <script type="text/javascript"> <!-- document.write("Hello World!"); //--> </script> </body> </html>
3 把JavaScript放置到何处
-
位于 head 部分的脚本:当脚本被调用时,或者当事件被触发时,脚本就会被执行。当你把脚本放置到 head 部分后,就可以确保在需要使用脚本之前,它已经被载入了。
<html> <head> <script type="text/javascript"> .... </script> </head> ....
-
位于 body 部分的脚本:在页面载入时脚本就会被执行。当你把脚本放置于 body 部分后,它就会生成页面的内容。
<html> <head> </head> <body> <script type="text/javascript"> .... </script> </body> </html>
-
使用外部JavaScript
- <script src="javascript.js">….<script>
- 您可以把 .js 文件放到网站目录中通常存放脚本的子目录中,这样更容易管理和维护。
4 JavaScript语句
4.1 JavaScript语句
- 浏览器把行末作为语句的结尾
- 分号是可选的,通过使用分号,可以在一行中写多条语句。
5 JavaScript注释
- 单行注释://comments
- 多行注释:/*comments*/
6 JavaScript变量
- 变量对大小写敏感(y和Y是两个不同的变量)
- 变量必须以字母或下划线开始
- 可以通过var语句来声明JavaScript变量
- 可以在声明它们时向变量赋值
-
如果您所赋值的变量还未进行过声明,该变量会自动声明
-
这些语句:
x=5; carname="Volvo";
-
与这些语句的效果相同:
var x=5; var carname="Volvo";
-
这些语句:
- 如果您再次声明了JavaScript变量,该变量也不会丢失其原始值。
7 JavaScript运算符
- 如果把数字与字符串相加,结果将成为字符串。
8 JavaScript比较和逻辑运算符
- ==:等于
- ===:全等
9 JavaScript If…Else语句
- if
- if … else
- if … else if … else
- switch
10 JavaScript消息框
10.1 警告框
- 警告框经常用于确保用户可以得到某些信息。
- 当警告框出现后,用户需要点击确定按钮才能继续进行操作。
- alert("文本")
10.2 确认框
- 确认框用于使用户可以验证或者接受某些信息。
- 当确认框出现后,用户需要点击确定或者取消按钮才能继续进行操作。
- 如果用户点击确认,那么返回值为true。如果用户点击取消,那么返回值为false。
- confirm("文本")
10.3 提示框
- 提示框经常用于提示用户在进入页面前输入某个值。
- 当提示框出现后,用户需要输入某个值,然后点击确认或取消按钮才能继续操纵。
- 如果用户点击确认,那么返回值为输入的值。如果用户点击取消,那么返回值为null。
- prompt("文本", "默认值")
11 JavaScript函数
11.1 JavaScript函数
- 将脚本编写为函数,就可以避免页面载入时执行该脚本。
- 函数包含着一些代码,这些代码只能被事件激活,或者在函数被调用时才会执行。
- 函数在页面起始位置定义,即 <head> 部分。
11.2 如何定义函数
11.2.1 创建函数的语法:
function func(var1, var2, ...) { \\statements }
11.2.2 JavaScript变量的生存期
- 全局变量
- 局部变量
12 JavaScript For循环
<html> <body> <script type="text/javascript"> var i=0 for (i=0;i<=10;i++) { document.write("The number is " + i) document.write("<br />") } </script> </body> </html>
13 JavaScript While循环
<html> <body> <script type="text/javascript"> var i=0 while (i<=10) { document.write("The number is " + i) document.write("<br />") i=i+1 } </script> </body> </html>
14 JavaScript Break和Continue语句
- break语句:使用break语句来终止循环。
- continue语句:使用continue语句来终止当前的循环,然后从下一个值继续执行。
JavaScript For…In声明
<html> <body> <script type="text/javascript"> var x var mycars = new Array() mycars[0] = "Saab" mycars[1] = "Volvo" mycars[2] = "BMW" for (x in mycars) { document.write(mycars[x] + "<br />") } </script> </body> </html>
15 JavaScript事件
- 事件是可以被JavaScript侦测到的行为。
-
事件举例:
- 鼠标点击
- 页面或图像载入
- 鼠标悬浮于页面的某个热点之上
- 在表单中选取输入框
- 确认表单
- 键盘按键
-
JavaScript事件参考
属性 当以下情况发生时,出现此事件 FF N IE onabort 图像加载被中断 1 3 4 onblur 元素失去焦点 1 2 3 onchange 用户改变域的内容 1 2 3 onclick 鼠标点击某个对象 1 2 3 ondblclick 鼠标双击某个对象 1 4 4 onerror 当加载文档或图像时发生某个错误 1 3 4 onfocus 元素获得焦点 1 2 3 onkeydown 某个键盘的键被按下 1 4 3 onkeypress 某个键盘的键被按下或按住 1 4 3 onkeyup 某个键盘的键被松开 1 4 3 onload 某个页面或图像被完成加载 1 2 3 onmousedown 某个鼠标按键被按下 1 4 4 onmousemove 鼠标被移动 1 6 3 onmouseout 鼠标从某元素移开 1 4 4 onmouseover 鼠标被移到某元素之上 1 2 3 onmouseup 某个鼠标按键被松开 1 4 4 onreset 重置按钮被点击 1 3 4 onresize 窗口或框架被调整尺寸 1 4 4 onselect 文本被选定 1 2 3 onsubmit 提交按钮被点击 1 2 3 onunload 用户退出页面 1 2 3
16 JavaScript Try…Catch语句
17 JavaScript特殊字符
代码 | 输出 |
---|---|
\' | 单引号 |
\" | 双引号 |
\& | 和号 |
\\ | 反斜杠 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符 |
\b | 退格符 |
\f | 换页符 |
18 JavaScript指导方针
- JavaScript对大小写敏感
- JavaScript会忽略多余的空格
- 您可以在文本字符串内部使用反斜杠对代码进行折行
19 JavaScript对象简介
- JavaScript是面向对象的编程语言(OOP)。
-
对象拥有属性和方法。
- 属性:属性指与对象有关的值。
- 方法:方法指对象可以执行的行为(或者可以完成的功能)。
20 JavaScript字符串(String)对象
-
计算字符串的长度
<html> <body> <script type="text/javascript"> var txt="Hello World!" document.write(txt.length) </script> </body> </html>
-
indexOf()方法
<html> <body> <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> </body> </html>
-
match()方法
<html> <body> <script type="text/javascript"> var str="Hello world!" document.write(str.match("world") + "<br />") document.write(str.match("World") + "<br />") document.write(str.match("worlld") + "<br />") document.write(str.match("world!")) </script> </body> </html>
-
replace()方法
<html> <body> <script type="text/javascript"> var str="Visit Microsoft!" document.write(str.replace(/Microsoft/,"W3School")) </script> </body> </html>
20.1 String对象的方法
- JavaScript的字符串是不可变的
-
String类定义的方法都不能改变字符串的内容
方法 描述 FF N IE anchor() 创建 HTML 锚。 1 2 3 big() 用大号字体显示字符串。 1 2 3 blink() 显示闪动字符串。 1 2 bold() 使用粗体显示字符串。 1 2 3 charAt() 返回在指定位置的字符。 1 2 3 charCodeAt() 返回在指定的位置的字符的 Unicode 编码。 1 4 4 concat() 连接字符串。 1 4 4 fixed() 以打字机文本显示字符串。 1 2 3 fontcolor() 使用指定的颜色来显示字符串。 1 2 3 fontsize() 使用指定的尺寸来显示字符串。 1 2 3 fromCharCode() 从字符编码创建一个字符串。 1 4 4 indexOf() 检索字符串。 1 2 3 italics() 使用斜体显示字符串。 1 2 3 lastIndexOf() 从后向前搜索字符串。 1 2 3 link() 将字符串显示为链接。 1 2 3 localeCompare() 用本地特定的顺序来比较两个字符串。 1 4 4 match() 找到一个或多个正在表达式的匹配。 1 4 4 replace() 替换与正则表达式匹配的子串。 1 4 4 search() 检索与正则表达式相匹配的值。 1 4 4 slice() 提取字符串的片断,并在新的字符串中返回被提取的部分。 1 4 4 small() 使用小字号来显示字符串。 1 2 3 split() 把字符串分割为字符串数组。 1 4 4 strike() 使用删除线来显示字符串。 1 2 3 sub() 把字符串显示为下标。 1 2 3 substr() 从起始索引号提取字符串中指定数目的字符。 1 4 4 substring() 提取字符串中两个指定的索引号之间的字符。 1 2 3 sup() 把字符串显示为上标。 1 2 3 toLocaleLowerCase() 把字符串转换为小写。 - - - toLocaleUpperCase() 把字符串转换为大写。 - - - toLowerCase() 把字符串转换为小写。 1 2 3 toUpperCase() 把字符串转换为大写。 1 2 3 toSource() 代表对象的源代码。 1 4 - toString() 返回字符串。 - - - valueOf() 返回某个字符串对象的原始值 1 2 4
20.2 String对象的属性
属性 | 描述 | FF | N | IE |
---|---|---|---|---|
constructor | 对创建该对象的函数的引用 | 1 | 4 | 4 |
length | 字符串的长度 | 1 | 2 | 3 |
prototype | 允许您向对象添加属性和方法 | 1 | 2 | 4 |
21 JavaScript Date(日期)对象
-
返回当日的日期和时间
<html> <body> <script type="text/javascript"> document.write(Date()) </script> </body> </html>
-
getTime()
<html> <body> <script type="text/javascript"> var minutes = 1000*60 var hours = minutes*60 var days = hours*24 var years = days*365 var d = new Date() var t = d.getTime() var y = t/years document.write("It's been: " + y + " years since 1970/01/01!") </script> </body>
-
setFullYear()
<html> <body> <script type="text/javascript"> var d = new Date() d.setFullYear(1992,10,3) document.write(d) </script> </body> </html>
-
toUTCString()
<html> <body> <script type="text/javascript"> var d = new Date() document.write (d.toUTCString()) </script> </body> </html>
-
时钟
<html> <head> <script type="text/javascript"> function startTime() { var today=new Date() var h=today.getHours() var m=today.getMinutes() var s=today.getSeconds() // add a zero in front of numbers<10 m=checkTime(m) s=checkTime(s) document.getElementById('txt').innerHTML=h+":"+m+":"+s t=setTimeout('startTime()',500) } function checkTime(i) { if (i<10) { i="0" + i } return i } </script> </head> <body onload="startTime()"> <div id="txt"></div> </body> </html>
21.1 Date对象的方法
方法 | 描述 | FF | N | IE |
---|---|---|---|---|
Date() | 返回当日的日期和时间 | 1 | 2 | 3 |
getDate() | 从Date对象返回一个月中的某一天 (1 ~ 31) | 1 | 2 | 3 |
getDay() | 从Date对象返回一周中的某一天 (0 ~ 6) | 1 | 2 | 3 |
getMonth() | 从Date对象返回月份 (0 ~ 11) | 1 | 2 | 3 |
getFullYear() | 从Date对象以四位数字返回年份 | 1 | 4 | 4 |
getYear() | 从Date对象以两位或四位数字返回年份。 | 1 | 2 | 3 |
getHours() | 返回Date对象的小时 (0 ~ 23) | 1 | 2 | 3 |
getMinutes() | 返回Date对象的分钟 (0 ~ 59) | 1 | 2 | 3 |
getSeconds() | 返回Date对象的秒数 (0 ~ 59)) | 1 | 2 | 3 |
getMilliseconds() | 返回Date对象的毫秒(0 ~ 999) | 1 | 4 | 4 |
getTime() | 返回 1970 年 1 月 1 日至今的毫秒数 | 1 | 2 | 3 |
getTimezoneOffset() | 返回本地时间与格林威治标准时间的分钟差 (GMT) | 1 | 2 | 3 |
getUTCDate() | 根据世界时从Date对象返回月中的一天 (1 ~ 31) | 1 | 4 | 4 |
getUTCDay() | 根据世界时从Date对象返回周中的一天 (0 ~ 6) | 1 | 4 | 4 |
getUTCMonth() | 根据世界时从Date对象返回月份 (0 ~ 11) | 1 | 4 | 4 |
getUTCFullYear() | 根据世界时从Date对象返回四位数的年份 | 1 | 4 | 4 |
getUTCHours() | 根据世界时返回Date对象的小时 (0 ~ 23) | 1 | 4 | 4 |
getUTCMinutes() | 根据世界时返回Date对象的分钟 (0 ~ 59) | 1 | 4 | 4 |
getUTCSeconds() | 根据世界时返回Date对象的秒钟 (0 ~ 59) | 1 | 4 | 4 |
getUTCMilliseconds() | 根据世界时返回Date对象的毫秒(0 ~ 999) | 1 | 4 | 4 |
parse() | 返回1970年1月1日午夜到指定日期(字符串)的毫秒数 | 1 | 2 | 3 |
setDate() | 设置Date对象中月的某一天 (1 ~ 31)) | 1 | 2 | 3 |
setMonth() | 设置Date对象中月份 (0 ~ 11)) | 1 | 2 | 3 |
setFullYear() | 设置Date对象中的年份(四位数字) | 1 | 4 | 4 |
setYear() | 设置Date对象中的年份(两位或四位数字)。 | 1 | 2 | 3 |
setHours() | 设置Date对象中的小时 (0 ~ 23) | 1 | 2 | 3 |
setMinutes() | 设置Date对象中的分钟 (0 ~ 59) | 1 | 2 | 3 |
setSeconds() | 设置Date对象中的秒钟 (0 ~ 59) | 1 | 2 | 3 |
setMilliseconds() | 设置Date对象中的毫秒 (0 ~ 999) | 1 | 4 | 4 |
setTime() | 通过向或从1970年1月1日午夜添加或减去指定数目的毫秒来计算日期和时间 | 1 | 2 | 3 |
setUTCDate() | 根据世界时设置Date对象中月份的一天 (1 ~ 31) | 1 | 4 | 4 |
setUTCMonth() | 根据世界时设置Date对象中的月份 (0 ~ 11) | 1 | 4 | 4 |
setUTCFullYear() | 根据世界时设置Date对象中年份(四位数字) | 1 | 4 | 4 |
setUTCHours() | 根据世界时设置Date对象中小时 (0 ~ 23) | 1 | 4 | 4 |
setUTCMinutes() | 根据世界时设置Date对象中分钟 (0 ~ 59) | 1 | 4 | 4 |
setUTCSeconds() | 根据世界时设置Date对象中秒钟 (0 ~ 59) | 1 | 4 | 4 |
setUTCMilliseconds() | 根据世界时设置Date对象中毫秒S(0 ~ 999) | 1 | 4 | 4 |
toSource() | 代表对象的源代码 | 1 | 4 | - |
toString() | 把Date对象转换为字符串。 | 1 | 2 | 4 |
toTimeString() | 把Date对象的时间部分转换为字符串。 | 1 | 2 | 4 |
toDateString() | 把Date对象的日期部分转换为字符串。 | 1 | 2 | 4 |
toGMTString() | 根据格林威治时间,把Date对象转换为字符串。 | 1 | 2 | 3 |
toUTCString() | 根据世界时,把Date对象转换为字符串。 | 1 | 4 | 4 |
toLocaleString() | 根据本地时间格式,把Date对象转换为字符串。 | 1 | 2 | 3 |
toLocaleTimeString() | 根据本地时间格式,把Date对象的时间部分转换为字符串 | 1 | 2 | 3 |
toLocaleDateString() | 根据本地时间格式,把Date对象的日期部分转换为字符串 | 1 | 2 | 3 |
UTC() | 根据世界时,获得一个日期,然后返回1970年1月1日午夜到该日期的毫秒数。 | 1 | 2 | 3 |
valueOf() | 返回Date对象的原始值。 | 1 | 2 | 4 |
22 JavaScript数组
-
创建数组
<html> <body> <script type="text/javascript"> var mycars = new Array() mycars[0] = "Saab" mycars[1] = "Volvo" mycars[2] = "BMW" for (i=0;i<mycars.length;i++) { document.write(mycars[i] + "<br />") } </script> </body> </html>
-
For…In声明
<html> <body> <script type="text/javascript"> var x var mycars = new Array() mycars[0] = "Saab" mycars[1] = "Volvo" mycars[2] = "BMW" for (x in mycars) { document.write(mycars[x] + "<br />") } </script> </body> </html>
22.1 Array对象的方法
方法 | 描述 | FF | N | IE |
---|---|---|---|---|
concat() | 连接两个或更多的数组,并返回结果。 | 1 | 4 | 4 |
join() | 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 | 1 | 3 | 4 |
pop() | 删除并返回数组的最后一个元素 | 1 | 4 | 5.5 |
push() | 向数组的末尾添加一个或更多元素,并返回新的长度。 | 1 | 4 | 5.5 |
reverse() | 颠倒数组中元素的顺序。 | 1 | 3 | 4 |
shift() | 删除并返回数组的第一个元素 | 1 | 4 | 5.5 |
slice() | 从某个已有的数组返回选定的元素 | 1 | 4 | 4 |
sort() | 对数组的元素进行排序 | 1 | 3 | 4 |
splice() | 删除元素,并向数组添加新元素。 | 1 | 4 | 5.5 |
toSource() | 代表对象的源代码 | 1 | 4 | - |
toString() | 把数组转换为字符串,并返回结果。 | 1 | 3 | 4 |
toLocaleString() | 把数组转换为本地数组,并返回结果。 | 1 | 3 | 4 |
unshift() | 向数组的开头添加一个或更多元素,并返回新的长度。 | 1 | 4 | 6 |
valueOf() | 返回数组对象的原始值 | 1 | 2 | 4 |
23 JavaScript Boolean(逻辑)对象
- Boolean 对象是 JavaScript 的一种基本数据类型。
- Boolean 对象是一个把布尔值打包的布尔对象。
23.1 Boolean对象的方法
方法 | 描述 | FF | N | IE |
---|---|---|---|---|
toSource() | 代表对象的源代码 | 1 | 4 | - |
toString() | 把逻辑值转换为字符串,并返回结果。 | 1 | 4 | 4 |
valueOf() | 返回Boolean对象的原始值 | 1 | 4 | 4 |
24 JavaScript Math(算数)对象
-
JavaScript提供8种可被Math对象访问的算数值:
含义 算数值 常数 Math.E 圆周率 Math.PI 2的平方根 Math.SQRT2 1/2的平方根 Math.SQRT12 2的自然对数 Math.LN2 10的自然对数 Math.LN10 以2为底的e的对数 Math.LOG2E 以10为底的e的对数 Math.LOG10E
25 JavaScript HTML DOM对象
25.1 HTML DOM对象
对象 | 描述 |
---|---|
Window | JavaScript层级中的顶层对象。Window对象表示浏览器窗口。 |
Navigator | 包含客户端浏览器的信息。 |
Screen | 包含客户端显示屏的信息。 |
History | 包含了浏览器窗口访问过的 URL。 |
Location | 包含了当前URL的信息。 |
创新工厂电面小记
其实我一直对这些明星公司抱有一种仰望的态度,像前几天的百度,已经很让我惊喜,给了我很大的信心。昨天的创新工厂电面,虽然自己被虐的比较惨,但是还是进一步明确了自己的方向,了解了自己的差距。
对开复老师,除了仰慕,更多的是一种敬重。老实说我并不觉得开复老师是个天才,我认为他能成功,有一部分原因是在正确的时间正确的地点遇到了正确的人。我从来就不相信“穷人的孩子早当家”,更多时候,良好的家庭背景条件,有眼光的父母亲情教育,宽容大度自由的义务教育和高等教育,是一个人成长成才的助推器。敬重开复,是因为这么多年他为帮助中国青年成长所倾注的心血。当然,少部分人在他背后说三道四,说他虚伪做作,对此,我只能说,这些小人连“虚伪做作”的资本都没有。
好了,废话少说,说说本次面试吧。面试的过程很简单,就是给你一套题,一个小时的时间,然后在根据你答题情况刨根问底。答题的网站是collabedit。大概是由于世界杯的原因,网络比较拥塞,刷了5分钟才刷出题目来。题目总共有22道,考的范围非常广泛,很能反应一个人平时的积累。由于不方便,所以我暂时不能把所有题目原数贴出。大概概述一下题目分布情况吧:
- c\c++基础题
- 双向链表插入
- 二叉树遍历(三种方式)
- 栈的基本操作
- 概率问题
- tcp和udp区别联系
- sql基础语法问题
- 概率问题
- 图论问题(好像是“三角形无关图”,就是求一个8个顶点的无向图中,不含三角形,那么最多的边有多少)
- 函数递归问题
- 编程序题目:给定一条直线(L: x=5)和一个定点序列a[n],组成一条折线a[0]a[1]...a[n],求这条折线与直线(L: x=5)有多少个交点。
- 设计模式(什么是Singleton模式,PHP如何实现)
- PHP和MySQL
- PHP中的_POST数组
- PHP中"==="和"=="两个操作符的差别
- 还是PHP
- 还是PHP
- 还是PHP
- JavaScript和iframe
- MySql: datetime和timestamp差别
- JavaScript和iframe
- jQuery: onload()和document.ready()
前面十道题目,除了两道概率问题,答得还算不错;第11道编程题目,我想到的是计算几何中判断线段相交的方法和问题,于是就用内积的方法写了个程序糊弄了上去。结果面试官告诉我说这道题目我只拿到了30%的分数。我一诧异,忙问个中缘由。他说这道题目考的不是线段相交。线段(L: x=5)是给定的,所以不用考虑的那么复杂,根本用不到内积这些东西,我说那就看a[n].x和5相比究竟震动了几次。然后面试官说如果两个交点相同,那么这两个点是算作一个点的。我一想,是啊是啊,是这个样子的。然后他说用怎样的方法可以去掉这些重复的点呢?我说简单啊,算出所有的点后直接排序不就好了。他说时间复杂度太高,让我优化一下。我想了半天也不知道怎么回答,他又提示我说哈希表怎么样?我哈希表用的不熟,转念一想,用哈希表的话,相同的点经过哈希函数映射确实可以“合并”。于是我慌忙补充下时间是线性的云云。
后面的题目我就束手无策了。对javascript和php,我只是听说,很早之前看过一些入门的章节,早忘光了。除了"=="和"==="是查了下手头的一本书简单写了下,其余的题目基本是空白,很是尴尬。面试官表示说你前面的十道题目答的都不错,编程题目不甚理想,灵活度不够,"=="和"==="是不是百度出来的?我说不是不是,也没有别人帮忙,寝室同学都不是计算机学院的。
最后他问我对这套题目有什么缺陷,或者自己有什么优点没有表现出来。我就说自己对linux还算了解,他随机给我出了一道题目:找出一个目录中文件名中包含hello, world的文件。我说用find就行,find . -name "hello, world", 他说不对,我想起来还得加一个recursive的参数。然后我又讲到了自己实验室的项目,他听了下又给我出了道题目:如何在iphone上面写一个帮助用户挑西瓜的程序。我犹豫了下问“iphone有没有办法称出一个物体的重量”——好蠢的问题……然后面试官提醒说“你平时是怎么挑西瓜的”。我说先看成色,再听声音,再看重量。然后我灵机一动说先挑出一部分好的西瓜,听他们的声音,然后将这些声音作成一个样本库,提取初相应的特征。然后去挑西瓜,用iphone录下用户敲西瓜的声音,与样本库里面的样本比对,看看相似度。嗯。大概这样。面试官表示这个答案还行。最后又问了我个排序的问题:给你若干个人,让你按照他们的年龄排序,有什么方法。显然这道题目是有陷阱的。但是我一时想不通,就随口说快排归并。他说不对,问我有没有听过桶排序,我说听说过不了解,他说就是做按照年龄1-100岁做100个桶,然后把扫描这些用户,按照年龄将用户排到桶里就可以了。我一想这么一来,时间复杂度只有[tex]O(n)[/tex]。是,是这么回事,基于比较的排序时间复杂度下限是[tex]O(\lg n)[/tex],突破这个极限的方法就是不采用比较,另寻他法进行排序。这就是“线性排序“。可是我对“线性排序“又不甚了解,导致现在的悲剧。综合而言还是自己的算法功底不够。
临结束时,他问我又没有什么问题要问他。我还是说“想听一下你对我的评价“,他说你的情况比较复杂,需要对我有一个评分,上报HR,可能需要多轮面试。我又问如果最后没有通知是不是就挂了,他说是的。我说好的,谢谢,辛苦了。
就这样结束了……总之,差距尤在,暑假需要实习,在算法,网络,数据库三方面加强训练。嗯。