Basic Algorithm Scripting
1010~1012
文章目录
- Basic Algorithm Scripting
- 1 Reverse a String *
- 2 Factorialize a Number *
- 3 Check for Palindromes* ?
- 4 Find the Longest Word in a String*
- 5 Title Case a Sentence * ?
- 6 Return Largest Numbers in Arrays
- 7 Confirm the Ending
- 8 Repeat a string repeat a string
- 9 Truncate a string
- 10 Chunky Monkey
- 11 Slasher Flick
- 12 Mutations 比较字符串
- 13 Falsy Bouncer
- 13 Falsy Bouncer
- 14 Seek and Destroy ✨
- 15 Where do I belong
- 16 Caesars Cipher?
1 Reverse a String *
function reverseString(str) {
// 请把你的代码写在这里
str = str.split("").reverse().join("");
return str;
}
String.split()
Array.reverse()
Array.join()
2 Factorialize a Number *
function factorialize(num) {
// 请把你的代码写在这里
var i;
var result = 1;
for(i = 1;i<=num;i++){
result = result*i;
}
return result;
}
factorialize(5);
3 Check for Palindromes* ?
- 去掉字符串多余的标点符号和空格
- 然后把字符串转化成小写
- 验证此字符串是否为回文
function palindrome(str) {
// 请把你的代码写在这里
var strReplace = str.replace(/[\s|\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]+/g,"");
strReplace = strReplace.toLowerCase();
var strReverse = strReplace.split("").reverse().join("");
if(strReplace === strReverse){
return true;
}else{
return false;
}
}
palindrome("eye");
str.replace(/[\s|\ |~|`|!|@|#|$|%|^|&|*|(|)|-|_|+|=|||\|[|]|{|}|;|:|"|’|,|<|.|>|/|?]+/g,"")
正则表达式:替换空格和多中标点符号
4 Find the Longest Word in a String*
- String convert to Array
- Find the max length in a array ( Other way to find max???)
function findLongestWord(str) {
// 请把你的代码写在这里
var array1 = str.split(" ");
var numOfWords = array1.length;
var maxWord;
var maxWordLength = 0;
for (var i = 0; i < array1.length; i++) {
//Find the max length in a array
if (maxWordLength < array1[i].length) {
maxWordLength = array1[i].length;
maxWord = array1[i];
}
}
return maxWordLength;
}
findLongestWord("The quick brown fox jumped over the lazy dog");
5 Title Case a Sentence * ?
- 把字符串切成单词组成的数组
- 遍历数组的每个成员
- 每个成员的首字母直接换成大写:
function titleCase(str) {
var array1 = str.split(' ');
var i;
for(i=0; i<array1.length; i++){
var fristLetter = array1[i][0];
array1[i][0] = array1[i][0].toUpperCase(); //这样不能改变字符串的改字符
}
str = array1.join(" ");
return str;
}
改进后
参考:https://www.cnblogs.com/jiangxiaobo/p/6276879.html
function titleCase(str) {
var array1 = str.toLowerCase().split(' ');
var i;
for(i=0; i<array1.length; i++){
array1[i] = array1[i].slice(0,1).toUpperCase()+ array1[i].slice(1);
}
return array1.join(" ");
}
slice(start,end)
返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
http://www.w3school.com.cn/jsref/jsref_slice_array.asp
- 用replace( )替换
function titleCase(str) {
var array1 = str.toLowerCase().split(' ');
var i;
for(i=0; i<array1.length; i++){
array1[i] = array1[i].replace(array1[i][0], array1[i][0].toUpperCase())
}
return array1.join(" ");
}
String.prototype.replace()
参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace
6 Return Largest Numbers in Arrays
function largestOfFour(arr) {
// 请把你的代码写在这里
var i,
j,
newArr=[0,0,0,0]; //输入的数组不是4维的怎么初始化??
for(i=0; i<arr.length;i++){
for(j=0;j<arr[i].length;j++){
if (arr[i][j]>newArr[i]){
newArr[i]=arr[i][j];
}
}
}
return newArr;
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
最简单的想法,最朴实的求最大值的算法。
newArr=[0,0,0,0]; //输入的数组不是4维的怎么初始化??
7 Confirm the Ending
str.substr(start[, length])
返回一个字符串中从指定位置开始到指定字符数的字符。
function confirmEnding(str, target) {
// 请把你的代码写在这里
var len = target.length;
if(str.substr(-len)==target){
return true;
}else{
return false;
}
}
confirmEnding("Bastian", "n");
8 Repeat a string repeat a string
str.repeat(count)
count: [0, +∞) ,表示在新构造的字符串中重复了多少遍原字符串。
构造并返回一个新字符串,该字符串包含被连接在一起的指定数量的字符串的副本。
function repeat(str, num) {
// 请把你的代码写在这里
if (num<0){
return '';
}else{
return str.repeat(num);
}
}
repeat("abc", 3);
9 Truncate a string
str.slice(beginSlice[, endSlice])
提取一个字符串的一部分,并返回一新的字符串。
参数:
- beginSlice : 从该索引(以 0 为基数)处开始提取原字符串中的字符。如果值为负数,会被当做 sourceLength + beginSlice 看待,这里的sourceLength 是字符串的长度 (例如, 如果beginSlice 是 -3 则看作是: sourceLength - 3)
- endSlice : 可选。在该索引(以 0 为基数)处结束提取字符串。如果省略该参数,slice会一直提取到字符串末尾。如果该参数为负数,则被看作是 sourceLength + endSlice,这里的 sourceLength 就是字符串的长度(例如,如果 endSlice 是 -3,则是, sourceLength - 3)。
对比:str.substr(start[, length])
var str1 = 'The morning is upon us.';
var str2 = str1.slice(4, -2); // OUTPUT: morning is upon u
(这里有点绕)
如果字符串的长度比指定的参数num长,则把多余的部分用…来表示。
切记,插入到字符串尾部的三个点号也会计入字符串的长度。
但是,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。
function truncate(str, num) {
// 请把你的代码写在这里
var len = str.length;
if (num>3){
if(len>num){
str = str.slice(0,-(len-num+3))+'...';
}
}else{
if(len>num){
str = str.slice(0,-(len-num))+'...';
}
}
return str;
}
truncate("A-tisket a-tasket A green and yellow basket", 11);
10 Chunky Monkey
push(element1, …, elementN) 将一个或多个元素添加到数组的末尾,并返回新数组的长度。
slice(begin, end) 返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。且原始数组不会被修改。
要求:把一个数组arr按照指定的数组大小size分割成若干个数组块。
分析:chunk(arr, size)
- 新数组:newArr
- 判断 nowLen = arr.length - i *size > size ?
- yes:将arr的前size个元素组成一个数组,并添加在newArr中。将arr的前size个元素组成一个数组,并添加在newArr中。newArr.push(slice(0,size-1))
- no:newArr.push(slice(i *size,nowLen-1))
function chunk(arr, size) {
// 请把你的代码写在这里
var newArr=[];
var nowLen,i;
for(i=0;i<arr.length/size;i++){
nowLen = arr.length - i*size;
if(nowLen>size){
newArr.push(arr.slice(i*size,i*size+size));
}else{
newArr.push(arr.slice(i*size,i*size+nowLen));
}
}
return newArr;
}
chunk(["a", "b", "c", "d"], 2);
11 Slasher Flick
splice(start[, deleteCount[, item1[, item2[, …]]]]) 通过删除现有元素和/或添加新元素来更改一个数组的内容。
- deleteCount 可选。整数,表示要移除的数组元素的个数。如果 deleteCount 是 0,则不移除元素。 这种情况下,至少应添加一个新元素。如果 deleteCount 大于start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。
如果deleteCount被省略,则其相当于(arr.length - start)。- 返回值:
由被删除的元素组成的一个数组。 如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。splice() 方法与 slice() 方法的作用是不同的,splice() 方法会直接对数组进行修改。
function slasher(arr, howMany) {
// 请把你的代码写在这里
arr.splice(0,howMany);
return arr;
}
slasher([1, 2, 3], 2);
12 Mutations 比较字符串
str.indexOf(searchValue[, fromIndex])
返回调用 String 对象中第一次出现的指定值的索引,开始在 fromIndex进行搜索。
题目:如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。
分析:mutation([“hello”, “hey”]),arr[1]字符串中的字符在arr[0]中是否都能找到。
- 遍历arr[1],flag=true,若arr[0].indexOf(arr[1][i])>0,继续1
- 若出现arr[0].indexOf(arr[1][i])<0,flag=false,退出。
function mutation(arr) {
// 请把你的代码写在这里
var i,flag=true;
var str1 = arr[0].toLowerCase();
var str2 = arr[1].toLowerCase();
for(i=0;i<str2.length;i++){
var num = str1.indexOf(str2[i]);
if(num>=0){
continue;
}else{
flag=false;
break;
}
}
return flag;
}
mutation(["Mary", "Army"]);
13 Falsy Bouncer
new Boolean([value])
- 如果第一个参数不是布尔值,则会将其转换为布尔值。
- 如果省略该参数,或者其值为 0、-0、null、false、NaN、undefined、或者空字符串(""),则生成的 Boolean 对象的值为 false。
- 如果传入的参数是 DOM 对象 document.all,也会生成值为 false的 Boolean 对象。
- 任何其他的值,包括值为 “false” 的字符串和任何对象,都会创建一个值为true的 Boolean 对象。
13 Falsy Bouncer
new Boolean([value])
- 如果第一个参数不是布尔值,则会将其转换为布尔值。
- 如果省略该参数,或者其值为 0、-0、null、false、NaN、undefined、或者空字符串(""),则生成的 Boolean 对象的值为 false。
- 如果传入的参数是 DOM 对象 document.all,也会生成值为 false的 Boolean 对象。
- 任何其他的值,包括值为 “false” 的字符串和任何对象,都会创建一个值为true的 Boolean 对象。
arr.filter(callback(element[, index[, array]])[, thisArg])
MDN的文档里解释得太复杂了,直接看例子再看定义就比较清楚了。
- filter 为数组中的每个元素调用一次 callback 函数,并利用所有使得 callback 返回** true 或 等价于 true **的值的元素创建一个新数组。callback 只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。
- 那些没有通过 callback 测试的元素会被跳过,不会被包含在新数组中。
- callback 被调用时传入三个参数:
- 元素的值
- 元素的索引
- 被遍历的数组
如果为 filter 提供一个 thisArg 参数,则它会被作为callback 被调用时的 this 值。否则,callback 的 this 值在非严格模式下将是全局对象,严格模式下为 undefined。callback 最终观察到的this值是根据通常函数所看到的 "this"的规则确定的。
filter 不会改变原数组,它返回过滤后的新数组。
function bouncer(arr) {
// 请把你的代码写在这里
function ifFalse(arr){
return Boolean(arr);
}
var newArr;
newArr = arr.filter(ifFalse);
return newArr;
}
bouncer([7, "ate", "", false, 9]);
14 Seek and Destroy ✨
arguments 是一个对应于传递给函数的参数的类数组对象。
题目:实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组arr1,其余的参数是待摧毁的值arr2。destroyer([1, 2, 3, 1, 2, 3], 2, 3);
分析:arr2的元素个数不一定,所以不能直接用arr1&&arr2[i],得遍历arr2。
function destroyer(arr) {
// 请把你的代码写在这里
var arr1 = arguments[0];
var args = Array.prototype.slice.call(arguments);//将arguments转为真正的数组后,才能对它使用slice()方法
var arr2 = args.slice(1);
function ifDest(arr1){
var i,ifEqual = true;
for(i=0;i<arr2.length;i++){
ifEqual = ifEqual && arr1 !== arr2[i];
}
return ifEqual;
}
return arr1.filter(ifDest);
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
15 Where do I belong
arr.sort([compareFunction])
- 如果没有指明 compareFunction ,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。
- 如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:
- 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
- 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
- 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。
compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
返回值:
- 排序后的数组。请注意,数组已原地排序,并且不进行复制。
// a - b < 0 时,a小于b,a 会被排列到 b之前,即小的排前面,升序
arr.sort(function(a,b){
return a-b;
})
// b - a < 0 时,b小于a,a 会被排列到 b 之前,即大的排前面,降序
arr.sort(function(a,b){
return b-a;
})
题目:先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。
function where(arr, num) {
// 请把你的代码写在这里
arr.sort(function(a,b){
return a-b;
});
//遍历数组,当num<=arr[i]时,把num插入到arr[i]前面splice(i, 0, num)
var i;
for(i=0;i<arr.length+1;i++){
if(num<=arr[i]){
arr.splice(i, 0, num);
return arr,i;
}
if(i==arr.length){
arr.splice(i, 0, num);
return arr,i;
}
}
}
where([40, 60], 50);
16 Caesars Cipher?
String.fromCharCode(num1, …, numN)
由于 fromCharCode 是 String 的静态方法,所以应该像这样使用:String.fromCharCode(),而不是作为你创建的 String 对象的方法。
String.fromCharCode(65,66,67) // "ABC"
str.charCodeAt(index)
返回Unicode 值
"ABC".charCodeAt(0) // returns 65:"A"
"ABC".charCodeAt(1) // returns 66:"B"
题目:
分析:
- 返回str的Unicode值,[A-Z]=[65-77-78-90]分别+13/-13
- 转换为str
- String.fromCharCode(65,66,67) // “ABC”,里面不能放数组!!
- “ABC”.charCodeAt(0) // returns 65:“A”
- 跳过特殊字符
function rot13(str) { // LBH QVQ VG!
var i;
var rotNum=[]; //数组的初始化
var strRot='';
for(i=0;i<str.length;i++){
if(str.charCodeAt(i)>=65 && str.charCodeAt(i)<=77){
//如果是大写
rotNum[i] = str.charCodeAt(i)+13;
}else if(str.charCodeAt(i)>=78 && str.charCodeAt(i)<=90){
rotNum[i] = str.charCodeAt(i)-13;
}else{
rotNum[i] = str.charCodeAt(i);
}
strRot = strRot + String.fromCharCode(rotNum[i]);
}
return strRot;
}
rot13("SERR PBQR PNZC"); // 你可以修改这一行来测试你的代码