算法笔试

练习地址:

https://www.nowcoder.com/test/question/93bc96f6d19f4795a4b893ee16e97654?pid=27976983&tid=55388436

A+B

1var line
2while (line = readline()) {
3    var lines = line.split(' ');
4    var a = parseInt(lines[0]);
5    var b = parseInt(lines[1]);
6    print(a + b);
7}

2

1let n = parseInt(readline())
2for (let i = 0; i < n; i++) {
3    let line = readline().split(' ')
4    let a = parseInt(line[0])
5    let b = parseInt(line[1])
6    console.log(a + b)
7}

3

1while(line = readline()){
2    let arr = line.split(' ')
3    let a = parseInt(arr[0])
4    let b = parseInt(arr[1])
5    if(a!==0||b!==0){
6        console.log(a+b)
7    }
8}

4

1while(true){
2     let arr = readline().split(' ').map(Number)
3     if(arr[0] === 0){
4         break
5     }
6    let ans = 0
7    for(let i=1; i<=arr[0]; i++){
8        ans += arr[i]
9    }
10    console.log(ans)
11}

5

1let n = parseInt(readline())
2
3for(let i = 0; i < n; i++) {
4    const arr = readline().split(' ').map(Number)
5    let sum = 0
6    const [a, ...resp] = arr;
7    for(let i = 0; i < a; i++){
8        sum+=resp[i]
9    }
10    console.log(sum)
11}

6

1while(line=readline()){
2    let sum = 0;
3    const [n, ...resp] = line.split(' ').map(Number)
4    for(let i = 0;i<n;i++){
5        sum+=resp[i]
6    }
7    console.log(sum)
8}

7

1let line;
2while(line=readline()){
3    const arr = line.split(' ').map(Number)
4    if(arr.every(i=>i===0)){
5        break
6    }
7    const res = arr.reduce((a, b)=>a+b, 0)
8    console.log(res)
9}

字符串排序1

1let n = parseInt(readline()) // 没啥用,只是拿出来占位
2let arr = readline().split(' ')
3arrSort = arr.sort()
4console.log(arrSort.join(' '))

字符串排序2

1while(line=readline()){
2    const arr = line.split(' ')
3    console.log(arr.sort().join(' '))
4}

字符串排序3

1while (line = readline()) {
2    console.log(line.split(',').sort().join(','))
3}

总结

  • 输入数组
    • 一定要记得转字符串到number
1let arr = [];
2let line;
3while ((line = read_line()) != "") {
4    arr.push(line.split(' ').map(v=>parseInt(v)));
5}

输入API

read_line()

  • 将读取至多1024个字符,当还未达到1024个时如果遇到回车或结束符,提前结束。
  • 读取多行最简单的办法是 while((line = read_line()) != '')

gets(n)

  • 将读取至多n个字符,当还未达到n个时如果遇到回车或结束符,会提前结束。
  • 回车符可能会包含在返回值中。
  • 如果字符串末尾不应该是回车符的话,

readInt()

读取(长)整数

readDouble()

读取浮点数

输出API

printsth(a, ...) 不加回车

输出不加回车的参数,空格分隔

print(a, ...) 加回车

输出加回车的参数,空格分隔

console.log(a, ...) 加回车

输出加回车的参数,空格分隔

示例

1var a, b;
2var solveMeFirst = (a,b) => a+b;
3while((a=readInt())!=null && (b=readInt())!=null){
4    let c = solveMeFirst(a, b);
5    print(c);
6}
7var line;
8var solveMeFirst = (a,b) => a+b;
9while((line = read_line()) != ''){
10    let arr = line.split(' ');
11    let a = parseInt(arr[0]);
12    let b = parseInt(arr[1]);
13    let c = solveMeFirst(a, b);
14    print(c);
15}

矩阵

情况一:输入的矩阵用空格分隔数字,没有[]和,

输入一个矩阵:每行以空格分隔。

3 2 3

1 6 5

7 8 9

1// 输入
2let arr = [];
3let line;
4while ((line = read_line()) != "") {
5    arr.push(line.split(' ').map(v=>parseInt(v)));
6}
7// 调试时输出:使用自测数据按钮时调试用,正式提交时要删掉。
8for (let i=0; i<arr.length; i++) {
9    for (let j=0; j<arr[i].length; j++) {
10        printsth(arr[i][j], ' ');
11    }
12    print();
13}

情况二:输入的矩阵带有中括号和逗号

[[3,2,3],

[1,6,5],

[7,8,9]]

对于这种没有给定矩阵行列数的输入,而且还包含中括号和逗号的输入,我们也是只能按照字符串拆分来进行。

1// 输入:
2let arr = [];
3let line;
4while ((line = read_line()) != "") {
5    // 字符串中replace四种:  ],	  [		]  空格
6    arr.push(line.replace(/\]\,/g, "").replace(/ /g, "").replace(/\[/g, "").replace(/\]/g, "").split(",").map(v=>parseInt(v)));
7}
8
9// 调试时输出:使用自测数据按钮时调试用,正式提交时要删掉。
10for (let i=0; i<arr.length; i++) {
11    for (let j=0; j<arr[i].length; j++) {
12        printsth(arr[i][j], ' ');
13    }
14    print();
15}

情况三:要求输出矩阵/数组带有中括号和逗号

1let arr = [[1,2,3],[4,5,6]]
2console.log(arr.toString())
3// 输出是:1,2,3,4,5,6
4// 这样就错了,没有中括号
5
6console.log(JSON.stringify(arr));
7// 这样是对的,可以输出数组和矩阵
8
9// 输出矩阵,这样也是可以的
10printsth('[');
11for (let i=0; i<arr.length; i++) {
12    printsth('[');
13    printsth(arr[i].join(', '));
14    printsth(']');
15    if (i < arr.length - 1)
16        printsth(', ');
17}
18print(']');

JS读取超长字符串

由于read_line()只能读取1024个字符,所以如果题目中的用例涉及到长度大于1024字符串的,需要用到gets(n)这个函数。

超过1024个字符的情况下:

1// 如果实际输入的字符长度为slen, slen < 10000,那么gets获取的字符串会再其后加一个回车符,令输入的字符串长度为slen + 1
2// 因此,假如字符串中不应该包含空白符的话,应该使用 .trim()
3// 注意,trim会将字符串头尾的回车、空格等空白符都删除。
4let line = gets(10000).trim();
5print(line.length);

trim()

  • 方法用于删除字符串的头尾空白符,空白符包括:空格、制表符 tab、回车、换行符 等其他空白符等。
  • 不适用于 null, undefined, Number 类型。