题目地址:www.nowcoder.com/ta/huawei
从易到难,慢慢刷题!
未必能100%通过用例,写的难看,复杂度还高,哎,丢死人了。
入门
HJ7 取近似值
描述
写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于 0.5 ,向上取整;小于 0.5 ,则向下取整。
数据范围:保证输入的数字在 32 位浮点数范围内
输入描述:
输入一个正浮点数值
输出描述:
输出该数值的近似整数值
示例1
输入:
5.5
输出:
6
说明:
0.5>=0.5,所以5.5需要向上取整为6
示例2
输入:
2.499
输出:
2
说明:
0.499<0.5,2.499向下取整为2
解题
利用 Math.round(),自动向上取整
let num = parseFloat(readline());
console.log(Math.round(num));
HJ15 求int型正整数在内存中存储时1的个数
描述
输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。
数据范围:保证在 32 位整型数字范围内\
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
示例1
输入:
5
输出:
2
示例2
输入:
0
输出:
0
题解
考察十进制至二进制的转化。
//十进制转其他
var x=110;
w(x);
w(x.toString(8));
w(x.toString(32));
w(x.toString(16));
//其他转十进制
var x='110';
w(parseInt(x,2));
w(parseInt(x,8));
w(parseInt(x,16));
let num = parseInt(readline())
num = num.toString(2);
let count = 0;
for(let i=0; i<num.length; i++){
if(num[i] === '1'){
count++
}
}
console.log(count)
HJ101 输入整型数组和排序标识,对其元素按照升序或降序进行排序
描述
输入整型数组和排序标识,对其元素按照升序或降序进行排序
数据范围: ,元素大小满足
\
输入描述:
第一行输入数组元素个数
第二行输入待排序的数组,每个数用空格隔开
第三行输入一个整数0或1。0代表升序排序,1代表降序排序
输出描述:
输出排好序的数字
示例1
输入:
8
1 2 4 9 3 55 64 25
0
输出:
1 2 3 4 9 25 55 64
示例2
输入:
5
1 2 3 4 5
1
输出:
5 4 3 2 1
解题
- map(parseInt) 返回错误输出,原因是parseInt有多个参数输入。
arr.sort((a,b) => a - b);a - b 决定了数组按值排序顺序。- 使用
arr.join(' ')而不是arr.toString()可避免数组内出现逗号
let num = parseInt(readline());
let arr = readline().split(' ').map((data)=>{
parseInt(data);
return data;
});
let sort_seq = readline();
function sortByValue(arr){
arr = arr.sort((a,b) => a - b);
return arr
}
if (sort_seq === '0'){
sortByValue(arr)
console.log(arr.join(' '));
}
else if (sort_seq === '1'){
sortByValue(arr).reverse();
console.log(arr.join(' '));
}
简单
HJ11 数字颠倒
描述
输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
数据范围: \
输入描述:
输入一个int整数
输出描述:
将这个整数以字符串的形式逆序输出
示例1
输入:
1516000
输出:
0006151
示例2
输入:
0
输出:
0
解题
let line = readline();
function reverseLine(line){
let rev_line = line.split('').reverse().join('');
return rev_line
}
console.log(reverseLine(line));
HJ12 字符串反转
描述
接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)
输入描述:
输入一行,为一个只包含小写字母的字符串。
输出描述:
输出该字符串反转后的字符串。
示例1
输入:
abcd
输出:
dcba
解题
let str = readline();
function rev_str(str){
let rev = str.split('').reverse().join('');
return rev;
}
console.log(rev_str(str));
HJ22 汽水瓶
描述
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是 5 瓶,方法如下:先用 9 个空瓶子换3瓶汽水,喝掉 3 瓶满的,喝完以后 4 个空瓶子,用 3 个再换一瓶,喝掉这瓶满的,这时候剩 2 个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用 3 个空瓶子换一瓶满的还给老板。如果小张手上有 n 个空汽水瓶,最多可以换多少瓶汽水喝?
数据范围:输入的正整数满足
注意:本题存在多组输入。
允许如题面所述向老板借汽水。
输入的 0 仅表示输入结束,并不用输出结果
输入描述:
输入文件最多包含 10 组测试数据,每个数据占一行,仅包含一个正整数 n( 1<=n<=100 ),表示小张手上的空汽水瓶数。n=0 表示输入结束,你的程序不应当处理这一行。
输出描述:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
示例1
输入:
3
10
81
0
输出:
1
5
40
说明:
样例 1 解释:用三个空瓶换一瓶汽水,剩一个空瓶无法继续交换
样例 2 解释:用九个空瓶换三瓶汽水,剩四个空瓶再用三个空瓶换一瓶汽水,剩两个空瓶,向老板借一瓶汽水喝完得三个空瓶换一瓶汽水还给老板
解题
这道题其实不难,但是我踩到了一个大坑,甚至现在都没弄明白这个坑怎么回事。
最初的方法是这样的,单独用例可以通过,但到保存和提交就开始疯狂报错,显示运行超时,内存占用0K,我真的不知道发生了什么。
let line = readline();
let each_line = [];
while(line !== '0'){
each_line.push(parseInt(line));
line = readline();
}
function count_bottles(empty){
let total = 0;
while(empty !== 0){
if (empty > 2){
total += parseInt(empty/3);
empty = parseInt(empty/3) + empty%3
}
else if(empty === 2){
total +=1;
empty = 0
console.log(total)
}
else{
empty=0;
console.log(total)
}
}
}
each_line.forEach(count_bottles)
我从网上找了找答案,发现有一个简单的写法替代读了再塞array塞完再挨个调用的过程。
while(empty = readline()){
let total = 0;
while(empty !== 0){
if (empty > 2){
total += parseInt(empty/3);
empty = parseInt(empty/3) + empty%3
}
else if(empty === 2){
total +=1;
empty = 0
console.log(total)
}
else{
empty=0;
console.log(total)
}
}
}
while(line = readline()){} 这个写法对于多组输入确实有用,我得背一下。
事实上这道题还有个究极简单的写法:
只能说审题,然后逻辑思考很重要了,其实最后理解就是:2个空瓶就能换一瓶
let str;
while(str = readline()){
console.log(Math.floor(parseInt(str)/2))
}
HJ31 单词倒排
描述
对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
数据范围:字符串长度满足
输入描述:
输入一行以空格来分隔的句子
输出描述:
输出句子的逆序
示例1
输入:
I am a student
输出:
student a am I
示例2
输入:
$bo*y gi!r#l
输出:
l r gi y bo
解题
这道题主要考正则表达,参考 www.runoob.com/jsref/jsref…
let line = readline();
let words = line.split(/[^a-zA-Z]+/).reverse().join(' ');
console.log(words)
HJ37 统计每个月兔子的总数
描述
有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
本题有多组数据。
数据范围:每组输入满足
输入描述:
多行输入,一行输入一个int型整数表示第n个月
输出描述:
每一行输出对应的兔子总数
示例1
输入:
1
2
3
4
5
9
输出:
1
1
2
3
5
34
解题
看到兔子就知道是斐波那契。F(n) = F(n-1) + F(n-2);
这里没有使用递归,递归对空间和时间的消耗都很大,而且很可能导致栈溢出。 对于这种有时间和内存限制的考试来说有点小危险。
斐波那契本质是数列,i-1与i-2的和为i,干脆就用array将每个月兔子的数量列出,随后相加,即得出当前月份兔子的数量。
function rabbits(mon){
let count = [];
count[0] = 0;
count[1] = 1;
for(let i=2; i<=mon; i++){
count[i] = count[i-1] + count[i-2];
}
return count[count.length-1];
}
while(mon = readline()){
console.log(rabbits(mon));
}
HJ50 四则运算
描述
输入一个表达式(用字符串表示),求这个表达式的值。
保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。
数据范围:表达式计算结果和过程中满足 ,字符串长度满足
输入描述:
输入一个算术表达式
输出描述:
得到计算结果
示例1
输入:
3+2*{1+2*[-4/(8-6)+7]}
输出:
25
解题
乍一看非常像PPL里面编译器怎么开发,但是JS有个取巧的办法,利用eval(),将传入的字符串作为js代码执行。
但js不识别中括号和花括号,因此需要替换一下。
function replace_bracket(line){
line = line.replace('[','(').replace(']',')').replace('{','(').replace('}',')')
return line
}
let statement = readline();
let result = eval(replace_bracket(statement));
console.log(result);
HJ53 杨辉三角的变形
描述
以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数,左上角数到右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。
求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。
数据范围:
本题有多组输入数据
输入描述:
输入一个int整数
输出描述:
输出返回的int值
示例1
输入:
4
2
输出:
3
-1
解题
- 找规律 杨辉三角的复杂程度起码为O(n^2),一不小心就超时了。
通过观察三角会发现偶数位置有规律:
当n<3时,没有偶数,输出-1;
当n为奇数时,第一个偶数位置在第二,输出2;
当n为偶数且能被4整除时,第一个偶数位置在第三,输出3;
当n为偶数但不能被4整除时,偶数位置在第四,输出4;
while(num = readline()){
console.log(get_even(num));
}
function get_even(n){
if(n<3){
return -1;
}
else if(n%2 == 1){
return 2
}
else if(n%2 == 0 && n%4 == 0){
return 3
}
else{
return 4;
}
}
- 真实使用杨辉三角的变形解题 - Python:
while True:
try:
n = int(input())
res = - 1 #初始化结果为-1
l = [[0]*(2*n+1) for _ in range(n)] #以n行的长度创建二维矩阵,每行开头插入2个0
l[0][2] = 1 #第一行起始值为1(因开头插入了两个0,所以第三位为1)
for x in range(1,n): #构造完整的杨辉三角矩阵
for j in range(2,2*(x+2)-1):
l[x][j] = l[x-1][j-2]+l[x-1][j-1]+l[x-1][j]
for i in range(len(l[n-1][2:])): #遍历杨辉三角矩阵最后一行,去掉开始插入的两个0
if int(l[n-1][2:][i])%2 == 0: #如果发现偶数,输入下标,并把答案res置为!=-1的值
print(i+1)
res = 0
break
if res == -1: #如果前面没有找到偶数,那么res还是初始值,输出即可满足题意
print(-1)
except:
break
HJ56 完全数计算
描述
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
输入n,请输出n以内(含n)完全数的个数。
数据范围:
本题输入含有多组样例。
输入描述:
输入一个数字n
输出描述:
输出不超过n的完全数的个数
示例1
输入:
1000
7
100
输出:
3
1
2
解题
首先,我套着算法皮的数学题。
这道题有个麻烦的地方是算法复杂度基本降不下去。写的时候很怕超时,好在没有。
完美数简介:
各个小于它的约数(真约数,列出某数的约数,去掉该数本身,剩下的就是它的真约数)的和等于它本身的自然数叫做完全数(Perfect number),又称完美数或完备数。
例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6。第二个完全数是28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,
简而言之:
- 遍历所有数
- 找该数的所有因数(只要找到n/2就可以,大于n/2没有因数)
- 求因数和,是否等于该数
显然要有两层for loop,O(n^2)
let num;
while(num = parseInt(readline())){
let perfect = [];
for(let j=2; j<num; j++){
let count = [];
for(let i=1; i<=j/2; i++){
if(j%i === 0){
count.push(i);
}
}
function sum(arr) {
return eval(arr.join("+"));
}
let tmp = sum(count);
if(tmp === j){
perfect.push(tmp);
}
}
if(perfect.length > 0){
console.log(perfect.length);
}
}
HJ61 放苹果 (动态规划)
描述
把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
数据范围:,
。
本题含有多组样例输入。
输入描述:
输入两个int整数
输出描述:
输出结果,int型
示例1
输入:
7 3
输出:
8
解题
考察动态规划
参考视频: www.bilibili.com/video/BV1X4…
function methods(m,n){
// 苹果或盘子数小于0, 报错
if(m<0 || n<0){
return 0
}
// 苹果或盘子只有一个,只有一种可能
else if(m === 1 || n === 1){
return 1
}
// 引入递归
else{
// 起码一个盘子空着的情况 + 苹果多余盘子(即最多剩下m-n个苹果)的情况
return methods(m,n-1) + methods(m-n,n)
}
}
let line;
while(line = readline()){
line = line.split(' ').map((data) =>{
data = parseInt(data);
return data;
});
console.log(methods(line[0],line[1]));
}
HJ62 查找输入整数二进制中1的个数 (进制转换)
描述
输入一个正整数,计算它在二进制下的1的个数。
*注意多组输入输出!!!!!!*
数据范围:
输入描述:
输入一个整数
输出描述:
计算整数二进制中1的个数
示例1
输入:
5
输出:
2
说明:
5的二进制表示是101,有2个1
示例2
输入:
0
输出:
0
解题
小心多组输入!!!
考进制转换
let num;
while(num = readline()){
num = parseInt(num).toString(2);
let count = 0;
for(let i=0; i<num.length; i++){
if(num[i] === '1'){
count++
}
}
console.log(count);
}
HJ66 配置文件恢复
放弃这题……太烦了
HJ72 百钱买百鸡问题
描述
公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
现要求你打印出所有花一百元买一百只鸡的方式。
输入描述:
输入任何一个整数,即可运行程序。
输出描述:
输出有数行,每行三个整数,分别代表鸡翁,母鸡,鸡雏的数量
示例1
输入:
1
输出:
0 25 75
4 18 78
8 11 81
12 4 84
解题
没有复杂度要求,事情一下变得简单了,列方程5a + 3b + (1/3)*(100-a-b) = 100,两层 for loop 算出 a,b。 注意 c=100-a-b 需为整数, b取整。
function getChicken(){
for(let a=0; a<=100/5; a++){
for(let b=0; b<Math.round(100/3); b++){
let c = 100-a-b;
if(a*5+b*3+c*(1/3)===100 && c%3 ===0){
console.log(a + ' ' + b + ' ' + c);
}
}
}
}
let num;
while(num = readline()){
getChicken()
}
HJ73 计算日期到天数转换
描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
进阶:时间复杂度:,空间复杂度:
输入描述:
输入一行,每行空格分割,分别是年,月,日
输出描述:
输出是这一年的第几天
示例1
输入:
2012 12 31
输出:
366
示例2
输入:
1982 3 4
输出:
63
解题
- 闰年算法
if((n%4 == 0 && n%100 != 0) || n %400 == 0){}
function countDates(arr){
let month = [31,28,31,30,31,30,31,31,30,31,30,31];
let y = arr[0];
let m = arr[1];
let d = arr[2]
if((y%4 == 0 && y%100 != 0) || y %400 == 0){
month[1] +=1
}
let dates = 0;
for(let i=0; i<m-1;i++){
dates += month[i]
}
dates += d;
return dates
}
let line;
while(line = readline()){
let arr = line.split(' ');
let tmp = arr.map((i) =>{
return parseInt(i);
})
console.log(countDates(tmp));
}
HJ74 参数解析
描述
在命令行输入如下命令:
xcopy /s c:\ d:\e,
各个参数如下:
参数1:命令字xcopy
参数2:字符串/s
参数3:字符串c:\
参数4: 字符串d:\e
请编写一个参数解析程序,实现将命令行各个参数解析出来。
解析规则:
1.参数分隔符为空格
2.对于用""包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s "C:\program files" "d:"时,参数仍然是4个,第3个参数应该是字符串C:\program files,而不是C:\program,注意输出参数时,需要将""去掉,引号不存在嵌套情况。
3.参数不定长
4.输入由用例保证,不会出现不符合要求的输入
数据范围:字符串长度:
进阶:时间复杂度:,空间复杂度:
输入描述:
输入一行字符串,可以有空格
输出描述:
输出参数个数,分解后的参数,每个参数都独占一行
示例1
输入:
xcopy /s c:\ d:\e
输出:
4
xcopy
/s
c:\
d:\e
解题
挨个处理每一个字符, 遇到空就跳,遇到引号整个切下。
或许也可以用正则做,匹配的更准。
function splitCmd(line){
let fragments = [];
let word ='';
while(line.length > 0){
if(line[0] !== ' ' && line[0] !== "\""){
word += line.splice(0,1);
}
if(line[0] ===" "){
fragments.push(word)
line.splice(0,1)
word = '';
}
if(line[0] === '\"'){
line.splice(0,1);
let last = line.indexOf('\"')
let word = line.splice(0, last).join('');
line.splice(0,1);
fragments.push(word);
word = '';
}
}
if(word !== ''){
fragments.push(word);
}
let empty = fragments.indexOf('')
empty > 0 ? fragments.splice(empty,1) :false;
console.log(fragments.length)
fragments.forEach(frag => console.log(frag));
}
let line;
while(line = readline()){
splitCmd(line.split(''));
}
HJ75 公共子串计算
描述
给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度。
注:子串的定义指一个字符串删掉其部分前缀和后缀(也可以不删)后形成的字符串。
数据范围:字符串长度:
进阶:时间复杂度:,空间复杂度:
输入描述:
输入两个只包含小写字母的字符串
输出描述:
输出一个整数,代表最大公共子串的长度
示例1
输入:
asdfas
werasdfaswer
输出:
6
解题
时间复杂度给的很够,直接俩 loop 暴力破解。其实应该老实用动态规划做的。
function maxSubstring(arr){
let max = 0;
let first = arr[0];
let second = arr[1];
for(let i=0; i <= first.length; i++){
for(let j=1; j <= first.length; j++){
let tmp = first.substring(i,j);
if(second.includes(tmp)){
tmp.length > max ? max = tmp.length : max = max;
}
}
}
console.log(max);
}
let arr = [];
let line;
while(line = readline()){
arr.push(line);
}
maxSubstring(arr);
HJ76 尼科彻斯定理
描述
验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。
例如:
1^3=1
2^3=3+5
3^3=7+9+11
4^3=13+15+17+19
输入一个正整数m(m≤100),将m的立方写成m个连续奇数之和的形式输出。
本题含有多组输入数据。
数据范围:数据组数:,
进阶:时间复杂度:,空间复杂度:
\
输入描述:
输入一个int整数
输出描述:
输出分解后的string
示例1
输入:
6
输出:
31+33+35+37+39+41
解题
找规律,经观察:第一项为n (n-1)+1,最后一项为n(n+1)-1。
let num;
while(num = readline()){
num = parseInt(num);
let arr = [];
let start = num*(num-1)+1;
let end = num*(num+1)-1;
for(let i=start; i<=end; i+=2){
arr.push(i);
}
let str = arr.join("+");
console.log(str);
}
HJ83 二维数组操作
描述
有一个大小的数据表,你会依次进行以下5种操作:
1.输入和
,初始化
大小的表格。
2.输入x_1x1、y_1y1、x_2x2、y_2y2,交换坐标在(x_1,y_1)(x1,y1)和(x_2,y_2)(x2,y2)的两个数。
3.输入,在第
行上方添加一行。
4.输入,在第
列左边添加一列。
5.输入、
,查找坐标为
的单元格的值。\
请编写程序,判断对表格的各种操作是否合法。
详细要求:
1.数据表的最大规格为9行*9列,对表格进行操作时遇到超出规格应该返回错误。
2.对于插入操作,如果插入后行数或列数超过9了则应返回错误。如果插入成功了则将数据表恢复至初始化的大小,多出的数据则应舍弃。\
3.所有输入坐标操作,对大小的表格,行号坐标只允许0
m-1,列号坐标只允许0n-1。超出范围应该返回错误。
本题含有多组样例输入!
数据范围:数据组数:
进阶:时间复杂度:,空间复杂度:
\
输入描述:
输入数据按下列顺序输入:
1 表格的行列值
2 要交换的两个单元格的行列值
3 输入要插入的行的数值
4 输入要插入的列的数值
5 输入要查询的单元格的坐标
输出描述:
输出按下列顺序输出:
1 初始化表格是否成功,若成功则返回0, 否则返回-1
2 输出交换单元格是否成功
3 输出插入行是否成功
4 输出插入列是否成功
5 输出查询单元格数据是否成功
解题
瞅了一眼这道题通过率不高,估计和我一样题干看一半就抓狂的人不少。
HJ84 统计大写字母个数
描述
找出给定字符串中大写字符(即'A'-'Z')的个数。
数据范围:字符串长度:
字符串中可能包含空格或其他字符
进阶:时间复杂度:,空间复杂度:
\
输入描述:
本题含有多组样例输入
对于每组样例,输入一行,代表待统计的字符串
输出描述:
对于每组样例,输出一个整数,代表字符串中大写字母的个数 示例1
输入:
add123#$%#%#O
150175017(&^%&$vabovbao
A 1 0 11
输出:
1
0
1
解题
let line;
while(line = readline()){
let reg = /[A-Z]/g
let result = line.match(reg);
result !== null ? console.log(result.length) : console.log(0);
}
HJ85 最长回文子串
描述
给定一个仅包含小写字母的字符串,求它的最长回文子串的长度。
所谓回文串,指左右对称的字符串。
所谓子串,指一个字符串删掉其部分前缀和后缀(也可以不删)的字符串\
数据范围:字符串长度
进阶:时间复杂度:,空间复杂度:
\
输入描述:
输入一个仅包含小写字母的字符串
输出描述:
返回最长回文子串的长度\
示例1
输入:
cdabbacc
输出:
4
解题
智障解法:暴力破解
let line;
while(line = readline()){
let max = 0;
for(let i=0; i<=line.length; i++){
for(let j=0; j<line.length; j++){
let sub = line.substring(i,j);
let rev = sub.split('').reverse().join('');
if(sub === rev){
sub.length > max ? max = sub.length : false;
}
}
}
console.log(max);
}
HJ86 求最大连续bit数
描述
求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1\
本题含有多组样例输入。
数据范围:数据组数:,
进阶:时间复杂度:,空间复杂度:
\
输入描述:
输入一个int类型数字
输出描述:
输出转成二进制之后连续1的个数
示例1
输入:
3
5
200
输出:
2
1
2
说明:
3的二进制表示是11,最多有2个连续的1。
5的二进制表示是101,最多只有1个连续的1。
解题
连续的 1 中间或许间隔 0,则以 0 为切分符号,获得每一段 1 的数组,找出数组中长度最大的一项。
let line;
while(line = readline()){
let bin = parseInt(line).toString(2).split("0");
let max = 0;
bin.forEach((i) =>{
i.length > max ? max = i.length : false
})
console.log(max);
}
HJ97 记负均正
描述
首先输入要输入的整数个数n,然后输入n个整数。输出为n个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。
0即不是正整数,也不是负数,不计入计算
数据范围: ,输入的整数都满足
\
输入描述:
本题有多组输入用例。
首先输入一个正整数n,
然后输入n个整数。
输出描述:
输出负数的个数,和所有正整数的平均值。
示例1
输入:
5
1 2 3 4 5
10
1 2 3 4 5 6 7 8 9 0
输出:
0 3.0
0 5.0
解题
保留小数: toFixed(<位数>)
let arr = [];
let line;
while(line = readline()){
arr.push(line);
}
for(let i=0; i<arr.length; i+=2){
let len = arr[i];
let series = arr[i+1].split(' ').map((n) => parseInt(n));
let negative = 0;
let positive = [];
series.forEach((n) =>{
if(n > 0){
positive.push(n);
}
else if(n < 0){
negative++;
}
});
let mean = eval(positive.join('+')) / (positive.length);
mean = mean.toFixed(1);
console.log(negative + " " + mean);
}
HJ91 走方格的方案数
描述
请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
注:沿棋盘格之间的边缘线行走
本题含有多组样例输入。
数据范围:
输入描述:
每组样例输入两个正整数n和m,用空格隔开。(1≤n,m≤8)
输出描述:
每组样例输出一行结果\
示例1
输入:
2 2
1 2
输出:
6
3
解题
function paths(m,n){
if(m === 0 || n === 0){
return 1;
}
else{
return paths(m-1,n) + paths(m,n-1);
}
}
let line;
while(line = readline()){
line = line.split(' ');
line.forEach((num) => parseInt(num))
let [m,n] = line;
console.log(paths(m,n));
}
HJ100 等差数列
描述
等差数列 2,5,8,11,14。。。。
(从 2 开始的 3 为公差的等差数列)
输出求等差数列前n项和
本题有多组输入
数据范围:
输入描述:
输入一个正整数n。
输出描述:
输出一个相加后的整数。
示例1
输入:
2
输出:
7
说明:
2+5=7
示例2
输入:
275
输出:
113575
说明:
2+5+...+821+824=113575
解题
// 末项 an = a1 + (n-1)*d
// 等差数列求和:首项加末项乘项数除2
let n;
while(n = parseInt(readline())){
let d = 3;
let a1 = 2;
let an = a1 + (n-1)*d;
let sum = ((a1+an) * n )/ 2
console.log(sum);
}
HJ106 字符逆序
描述
将一个字符串str的内容颠倒过来,并输出。
数据范围:\
输入描述:
输入一个字符串,可以有空格
输出描述:
输出逆序的字符串
示例1
输入:
I am a student
输出:
tneduts a ma I
示例2
输入:
nowcoder
输出:
redocwon
解题
let line;
while(line = readline()){
console.log(line.split('').reverse().join(''));
}
HJ108 求最小公倍数
描述
正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。
数据范围:
输入描述:
输入两个正整数A和B。
输出描述:
输出A和B的最小公倍数。
示例1
输入:
5 7
输出:
35
示例2
输入:
2 4
输出:
4
解题
let line;
while(line = readline()){
line = line.split(' ').map(num => parseInt(num));
let [a,b] = line;
console.log(common_multiple(a,b));
}
function common_multiple(a,b){
let max = a * b;
let result = max;
for(let i=a; i<=max; i++){
if(i%a === 0 && i%b ===0 && i < max){
return i;
}
}
return max;
}