在线OJ使用总结(acm)

赛码网OJ规则

用readLine()代替read_line()

用readLine()代替read_line()

用readLine()代替read_line()

用readLine()代替read_line()

用readLine()代替read_line()


// *项代表测试数据的时候固定不变的

var n = 0;  // *输入行计数:可以自动计算出行数
var input=['1 2','3 4']; //输入两行

// *模拟输入
function read_line(){
    var line = input[n];
    n++;
    return line;
}

 // *模拟输出
function print(x){
    console.log(x);
}

/////////////模拟a+b
(function(){
    var line;
    while(line = read_line()){
        line = line.split(' ');
        print(parseInt(line[0]) + parseInt(line[1]));
    }
})();
/////////////////////////////////////////////////////

多行数据处理

例如:当输入以下数据的时候:
3
1 1 1
9
1 5 -6 7 9 -16 0 -2 2
2
0 0
处理多行数据方法一:

var line;
var datas = [];
while(line = read_line()){
    line = line.split('
');  // 以行读取
    datas.push(line);
}
// print(datas) // 3,1 1 1,9,1 5 -6 7 9 -16 0 -2 2,2,0 0
while (datas.length) {
  var n = datas[0];
  var arr = datas[1].toString().split(' ');  // 最好toString()一下,强制为字符串哦~
  paper(n, arr);  // 具体的函数
  datas.shift(datas[0]);  // 重点:处理完成一组 弹出一组数据!
  datas.shift(datas[1]);  
}

var line;
var datas = [];
while(line = read_line()){
    line = line.split('
');  // 以行读取
    datas.push(line);
}
// print(datas) // 3,1 1 1,9,1 5 -6 7 9 -16 0 -2 2,2,0 0
while (datas.length) {
  var n = datas[0];
  var data = datas[1].toString().split(' ').map(function (item) {
    return parseInt(item);
  });

  print(n);
  print(data);
  print('====')
  
  //paper(n, arr);  // 具体的函数
  
  datas.shift(datas[0]);  // 重点:处理完成一组 弹出一组数据!
  datas.shift(datas[1]);  
}

处理多行数据方法二:
例如:对于已经分好块的数据
1 2
1
2 3
// 没有这个,为了理解方便加的注释
1 2
1
1 2

while(read_line()){  // 这里read_line()的意思是如果这一行有值,转换成布尔true
  var str1 = readLine().toString().split(' ');  // 这里用的是拼接函数
  var str2 = readLine().toString().split(' ');
  var str = str1.concat(str2);
  str = str.uniq().sort(cmp).join(' ');   // 自定义函数处理部分
  print(str);
}

例如:
对于没有分好块儿的数据,一般第一个数字是代表一共有几个数据块儿
所以我们先把第一个数据块儿提取出来,再像前面已经分好块儿那样做即可
2 // 代表两个数据块儿
1 2
1
2 3
// 没有这个,为了理解方便加的注释
1 2
1
1 2

var line = read_line();
while(line){
  var str1 = readLine().toString().split(' ');  // 这里用的是拼接函数
  var str2 = readLine().toString().split(' ');
  var str = str1.concat(str2);
  str = str.uniq().sort(cmp).join(' ');   // 自定义函数处理部分

  line --; // 处理一组数据总数据数目减一
  print(str);
}

js编程常用方法总结

1.join():数组->字符串,自动会加上逗号
2.split():字符串->数组,
3.strim():去除首尾空格
4.如果是单个数字,加上一层parseInt(),强制转换为整型
5.初始化的时候指定类型,
eg:
var num = 0; // Number
var arr = []; // 数组
6. 涉及到单个数字,或者数字的四则运算一定要parseInt
7. 清空上一组数据
8. 常见Math方法
9. num.toFixed(1)

其他常用方法:

var max = Math.max.apply(Math,arr); // arr为已知数组
toLocalUpperCase() // 转为大写字母

join():
用于把数组中的所有元素放入一个字符串。
元素是通过指定的分隔符进行分隔的。

split():
方法用于把一个字符串分割成字符串数组。
stringObject.split(separator,howmany)
separator必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。
howmany可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。

var str="How are you doing today?"

document.write(str.split(" ") + "<br />")  // How,are,you,doing,today?
document.write(str.split("") + "<br />")  // H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
document.write(str.split(" ",3))  // How,are,you

"2:3:4:5".split(":")	//将返回["2", "3", "4", "5"]
"|a|b|c".split("|")	//将返回["", "a", "b", "c"]
"hello".split("")	//可返回 ["h", "e", "l", "l", "o"]
"hello".split("", 3)	//可返回 ["h", "e", "l"]
输入:
3
1 2 3 4

// split('/n')读取后:
['3','1 2 3 4'];

小Tips

1.看清楚输入输出的格式
2.如果是大数据没有通过,很可能是read_line()读取除了问题,建议自己写一个拼接函数

pop():删除数组的最后一个元素,减少数组的长度,返回删除的值。

push(n):将参数加载到数组的最后,返回新数组的长度。

shift():删除数组的第一个元素,数组长度减1,返回删除的值。

unshift(n1,n2):把参数加载数组的前面,返回新数组的长度。

sort():按指定的参数对数组进行排序 ,返回的值是经过排序之后的数组

reverse():反转数组项的顺序,返回的值是经过排序之后的数组

concat(3,4):把两个数组拼接起来。 返回的值是一个副本

slice[start,end):返回从原数组中指定开始下标到结束下标之间的项组成的新数组(不影响原数组)
1个参数:n.即:n到末尾的所有
2个参数:[start,end]

splice():
删除:2个参数,起始位置,删除的项数
插入:3个参数,起始位置,删除的项数,插入的项
替换:任意参数,起始位置,删除的项数,插入任意数量的项

链接:http://www.cnblogs.com/Yfling/p/6680159.html
indexOf()和lastIndexOf():接受两个参数,要查找的项(可选)和查找起点位置的索引
indexOf():从数组开头向后查找
lastIndexOf():从数组末尾开始向前查找

every():对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
filter():对数组中的每一项运行给定函数,返回该函数会返回true的项组成数组。
forEach():对数组的每一项运行给定函数,这个方法没有返回值。
map():对数组的每一项运行给定函数,返回每次函数调用的结果组成的数组。
some():对数组的每一项运行给定参数,如果该函数对任一项返回true,则返回true。以上方法都不会修改数组中的包含的值。
reduce()和reduceRight():缩小数组的方法,这两个方法都会迭代数组的所有项,然后构建一个最终返回的值。
join(separator):将数组的元素组起一个字符串,以separator为分隔符,省略的话则用默认用逗号为分隔符

常用函数:

// parseInt转换为数组函数,数据格式必须如下面data所示
var data = '1 2 3 4 5 6';

var toArray = function(data) {
  var arr = [];
  var str = data.slice(0).split(' ');
  for (var i = 0; i < str.length; i++) {
    arr.push(parseInt(str[i]));
  }
  return arr;
}

//大数拼接
function readLine() {  // 核心:大数拼接问题
  var line = ""
  var next = read_line()
  while(next.length >= 1024) {
    line += next;
    next = read_line();
  }
  line += next;
  return line;
}

Array.prototype.uniq = function() {
    var res = [];
    var json = {};

    for (var i =0; i < this.length; i++) {
        if (!json[this[i]]) {
            res.push(this[i]);
            json[this[i]] = 1;
        }
    }
    return res;
}
////
var sum = readLine();
var data = readLine();
var res = [];
for (var i = 0; i < data.length; i++) {
  if (data[i] !== 'X' &&  data[i] !== '#') {
    var num = parseInt(data[i]);
    var start = (i - num) > 0 ? i - num : 0;
    var end = (i + num) < data.length ? i + num : data.length;

    for (var j = start; j <= end; j++) {
      if (data[j] === 'X') {
        res.push(j);
      }
    }
  }
}
print(res.uniq().length)

// 去重函数:
Array.prototype.uniq = function() {
    var res = [];
    var json = {};

    for (var i =0; i < this.length; i++) {
        if (!json[this[i]]) {
            res.push(this[i]);
            json[this[i]] = 1;
        }
    }
    return res;
}
2:利用正则
function unique(arr) {
    return arr.sort().join(",,").
    replace(/(,|^)([^,]+)(,,2)+(,|$)/g, "$1$2$4").
    replace(/,,+/g, ",").
    replace(/,$/, "").
    split(",")
}
3:ES6
var uniq = function(arr) {
    return Array.from(new Set(arr));
}
let uniq = [...new Set(arr)];  // arr是需要去重的数组
/////////////////////////////////////////////
// 比较函数
var cmp = function (a, b) {
    return a - b;
}
// 拼接函数
function readLine() {
  var line = ""
  var next = read_line()
  while(next.length >= 1024) {
    line += next;
    next = read_line();
  }
  line += next;
  return line;
}

//最大值
Math.max.apply(this, arr)

// 比较x与y是否相等
var equal = function(x, y) {
  var len1 = x.length;
  var len2 = y.length;
  if (len1 !== len2) return false;  // 不相等

  for (var i = 0; i < len1; i++) {
    if (x[i] === y[i]) continue;
    else {
      return false;
    }
  }
  return true;
}
// 任意数组的全排列
function permute(input) {
    var permArr = [],
    usedChars = [];
    function main(input){
        var i, ch;
        for (i = 0; i < input.length; i++) {
            ch = input.splice(i, 1)[0];
            usedChars.push(ch);
            if (input.length == 0) {
                permArr.push(usedChars.slice());
            }
            main(input);
            input.splice(i, 0, ch);
            usedChars.pop();
        }
        return permArr
    }
    return main(input);
};
console.log(permute([5, 3, 7, 1, 2]));

尚未总结:
根据某一属性排序:http://www.cnblogs.com/woodk/p/5535756.html
js按照两个条件排序:https://zhidao.baidu.com/question/1639668198909962740.html

// 判断两个对象是否相等
isequal = function(x, y) { 
  if ( x === y ) {
    return true;
  } 
  if ( ! ( x instanceof Object ) || ! ( y instanceof Object ) ) {
    return false;
  }
  if ( x.constructor !== y.constructor ) {
    return false;
  }
  for ( var p in x ) {
    if ( x.hasOwnProperty( p ) ) {
      if ( ! y.hasOwnProperty( p ) ) {
        return false;
      }
      if ( x[ p ] === y[ p ] ) {
        continue;
      }
      if ( typeof( x[ p ] ) !== "object" ) {
        return false;
      }
      if ( ! Object.equals( x[ p ], y[ p ] ) ) {
        return false;
      } 
    }
  }
  for ( p in y ) {
    if ( y.hasOwnProperty( p ) && ! x.hasOwnProperty( p ) ) {
      return false;
    }
  } 
  return true; 
};

objA={ 
 a:'123', 
 b:'000',
 c:'111'
}; 
objB={ 
 a:'123', 
 b:'000',
 c:'111'
}; 
var isEqual= isequal(objA, objB); 
console.log(isEqual);  // true

print(JSON.stringify(objB)==JSON.stringify(objB))

// 伪数组->数组
var arr = Array.prototype.slice.call(arguments)
var arr = Array.from(arguments);
// 判断一个数字是否是素数
function isPrime(num){
    // 不是数字或者数字小于2
    if(typeof num !== "number" || !Number.isInteger(num)){      // Number.isInterget 判断是否为整数
        return false;
    }

    //2是质数
    if(num == 2){
        return true; 
    }else if(num % 2 == 0){  //排除偶数
        return false;
    }
    //依次判断是否能被奇数整除,最大循环为数值的开方
    var squareRoot = Math.sqrt(num);
    //因为2已经验证过,所以从3开始;且已经排除偶数,所以每次加2
    for(var i = 3; i <= squareRoot; i += 2) {
      if (num % i === 0) {
         return false;
      }
    }
    return true;
}
// 输出指定区间的素数
var prime = function(len){
    var i,j;
    var arr = [];
     
  for(i = 1; i < len; i++){
    for(j=2; j < i; j++){  
      if(i%j === 0) {
         break;
      }
    }
     
    if(i <= j && i !=1){
      arr.push(i);
    }
    
  }
  return arr;
};


ES6 新增字符串扩展

// for…of:
let str="wbiokr";
for(let s of str){
    console.log(s)
}
//结果:w, b, i, o, k, r

// 判断一个字符串中是否包含一个字符(ES6)
var str = "12345";
print(str.includes('1'))  // true

//判断字符串是否以某个字符开头/结束 (ES6)
print(str.includes('c'))  // false
print(str.startsWith('str'))  // true
print(str.endsWith('ng'))  // true

// 字符串复制
var str = 'mo';
print(str.repeat(2))  // momo
原文地址:https://www.cnblogs.com/Yfling/p/6656939.html