网易2018校园招聘编程题真题集合(一)

刷了一套据说是网易2018校园招聘编程题真题集合的题,第一次刷题,感觉挺好,希望能坚持下去。特此记录,聊以慰藉。

Qus1 魔法币

试题描述

小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。
魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币
魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币
小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。

输入描述:

输入包括一行,包括一个正整数n(1 ≤ n ≤ 10^9),表示小易需要的魔法币数量。

输出描述:

输出一个字符串,每个字符表示该次小易选取投入的魔法机器。其中只包含字符'1''2'

示例1

输入

10

输出

122

试题分析

经分析机器1只产生奇数,机器2只产生偶数,从最终结果n的奇偶性可以最终生产数据n的是那个魔法机器,从而判断是那个数生成的n,依次追溯到初始数字为0,记录过程并逆序输出即可。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function main(n) {
var result = "";

while (n) {
if (n % 2 === 1) {
result = result + "1";
n = Math.floor((n - 1) / 2);
} else {
result = result + "2";
n = Math.floor((n - 2) / 2);
}
}
return result.split("").reverse().join("");
}
while (line = readline()) {
var lines = line.split(' ');
print(main(lines[0]));
}

反思

  1. 健壮性上没有判断输入是否为数字,实际实用可能对健壮性进行丰富;
  2. 使用while循环进行追溯,判断对象为标志位n,每次循环将n减少到上一个生成的数字;
  3. 由于字符串没有排序相关的方法,将字符串用split("")方法转化成数组,采用数组的reverse()方法进行进行逆序,最后使用数组的join("")方法拼接成字符串。

Qus2 相反数

试题描述

为了得到一个数的"相反数",我们将这个数的数字顺序颠倒,然后再加上原先的数得到"相反数"。例如,为了得到1325"相反数",首先我们将该数的数字顺序颠倒,我们得到5231,之后再加上原先的数,我们得到5231+1325=6556.如果颠倒之后的数字有前缀零,前缀零将会被忽略。例如n = 100, 颠倒之后是1.

输入描述:

输入包括一个整数n,(1 ≤ n ≤ 10^5)

输出描述:

输出一个整数,表示n的相反数

###示例1

输入

1325

输出

6556

试题分析

本题比较简单,取反然后与原始数字相加即可,由于实用Javascript这种弱类型语言,所以过程中需要注意变量类型。

代码实现

1
2
3
4
5
6
7
8
9
10
11
function main(x) {
var _x = String(x).split("").reverse().join("");
var result = parseInt(x) + parseInt(_x);

return result;
}

while (line = readline()) {
var lines = line.split(' ');
print(main(lines[0]));
}

反思

  1. 继续使用了第一题字符串翻转的思路,即字符串->数组->倒序->拼接字符串
  2. 数字转字符串实用了String()方法;
  3. 字符串转数字实用了parseInt()方法;

Qus3 字符串碎片

试题描述

一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:'aaa','bb','c'。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。

输入描述:

输入包括一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),s只含小写字母('a'-'z')

输出描述:

输出一个整数,表示所有碎片的平均长度,四舍五入保留两位小数。

如样例所示: s = "aaabbaaac"
所有碎片的平均长度 = (3 + 2 + 3 + 1) / 4 = 2.25

示例1

输入

aaabbaaac

输出

2.25

试题分析

此题最终计算公式需要的两个参数,被除数就是字符串slength,而除数就是字符串s中包括的所有碎片的个数。即本题的关键就是计算碎片个数。
碎片个数采用了遍历整个字符串,使用一个临时变量记录碎片开始,与之后每个字符串字符做比对,以此判断碎片个数。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function main(str) {
var _fragment = 1,
_temp = str[0],
s_length = str.length,
i = 1;
for (; i < s_length; i++) {
if (_temp !== str[i]) {
_fragment = _fragment + 1;
}
_temp = str[i];
}
return (s_length / _fragment).toFixed(2);
}
while (line = readline()) {
var lines = line.split(' ');
print(main(lines[0]));
}

反思

  1. 关于保留两位小数,采用了toFixed(2)方法,四舍五入保留到取舍的位数,本来打算用Math.floor(num*100)/100的方法向下取整,不过对于3.50这种末尾数字为0的小数,无法做到强制保留两位小数;
  2. 整理代码的时候,发现题目中限制了均为小写,如果不限制的话,可能还要涉及到大小写字母的处理,即字符串的toLowerCase()——转换字母为小写,toUpperCase()——转换字母为大写;
  3. 题目中还有一个问题可能有变化,即没有对重复的片段进行判断,因为增加此功能可能将算法变得特别复杂。