【刷题】JavaScript V8华为机试

  1. 合并表记录

描述
数据表记录包含表索引和数值(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出

输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开

输出描述:
输出合并后的键值对(多行)

题目分析:
第一行为键值对个数,第二行以后的为成对的index和value
牛客系统上的输入是ACM模式,需要用readline()来获取

//获取到了键值对的个数
let num=readline();
const obj={};
for(let i=0;i<num;i++){
//获取到了每一次的输入键值对
	const line=readline().split(" ");
	//如果obj[index]还不存在,就执行else的内容,把value写进去
	//如果已经存在了,就执行第一行语句,把value进行累加
	
//     第一次传入  index:line[0] 0  value:line[1] 1
    // obj[0]=undefined 执行第二条语句
    // obj[0]=line[1];
    //第二次再传入index为0的值时,obj[0]=1已存在,执行第一条语句
    //obj[0]=1(上一次传入的)+line[1](这一次传入的)
    //第三次传入 index:line[0] 1  value:line[1] 2
//     obj[1]=undefined,执行第二条语句,把value存入对应的index中 类推
	 if(obj[parseInt(line[0])]){
        obj[parseInt(line[0])] += parseInt(line[1])
    }else{
        obj[parseInt(line[0])] = parseInt(line[1])
    }
}
// 遍历输出

//在遍历对象的时候,key为整数类型或者可以转换为整数类型的字符串(例如:0),会将这些key从小到大优先进行遍历,然后其他的key会按照创建的实际顺序进行遍历。
// 所以直接就按照key升序进行输出了。

for(let index in obj){
console.log(index+" "+obj[index])}

2.提取不重复的整数
描述
输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字新的整数
保证输入的整数最后一位不是0
输入描述:
输入一个int型整数
输出描述:
按照从右向左的阅读顺序,返回一个不含重复数字的新的整数

解题思路:在看到这道题的时候,我抓到关键词:
从右向左----萌生出要把这个数字变成数组,翻转过来的想法reverse-----大佬直接从最后一位向前遍历,不需要这么麻烦。
最后一位不是0,我想的是用replace方法,把末尾为0的数全部替换掉
去重–我用的是set集合。set集合接收一个数组(或者其他有iterable接口的其他数据结构)作为参数,会自动自重,用到了…扩展运算符,将一个数组变成逗号分隔的参数序列
做完上面工作之后再把参数序列用join方法连接起来,再转换为Number
用到了很多方法,有点麻烦,而且要清楚这些方法究竟是数组的方法还是字符串方法。

let arr=(readline().replace(/0+$/,"").split("").reverse())
//replace:字符串方法,把字符串中以0结尾的数全部替换掉
// split:字符串方法,将一个字符串拆分成一个数组
// reverse:数组方法,翻转数组
// 去重 set集合  
// ...扩展运算符,将一个数组变成逗号分隔的参数序列
// 
// function quchong(arr){ 
//     var result=[...new Set(arr)];
//     return result;
// }
let qc=arr=>[...new Set(arr)]
var result1=qc(arr)
// 把数组变成整数
console.log(Number(result1.join("")));

去看了一个高赞回答:
还是先获取输入,把输入转换为字符串。
用字符串的indexOf方法, 如果字符串里面没有这个数据的话就写入,有的话就跳过。但为什么可以忽略末尾的0啊。。。

//获取输入,把输入的数字转换成字符串
var num = Number(readline()).toString();
// 从字符串的最后一位开始,一直遍历到index为0时的值
// 当str里面没有这个数字的时候,即str.indexOf(num)=-1 就把它添加到str里面去
let str = '';
for(let i = num.length-1; i >=0; i--){
    if(str.indexOf(num[i]) == '-1'){
        str += num[i]
    }
}
console.log(Number(str))

因为觉得没有去除最后的0有点bug,所以把我俩的方法综合了一下,做了点改动:
先把最后面的0去掉,再从后向前遍历,如果没有就写入str,最后把str转换为Number输出。

let arr=readline().replace(/0+$/,"");
let str='';
for(let i=arr.length-1;i>=0;i--){
    if(str.indexOf(arr[i])=="-1"){
        str+=arr[i];
    }
}
console.log(Number(str))
  1. 字符个数统计

描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在ASCII码范围内(0~127,包括0和127),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串abaca而言,有a、b、c三种不同的字符,因此输出3。
输入描述:
输入一行没有空格的字符串。

输出描述:
输出 输入字符串 中范围在(0~127,包括0和127)字符的种数。

我的做题思路是: 先遍历数组,把第一次出现的字符写入,并让num自加,第二次出现就不管了。然后输出num

let str=readline();
var str1="";
var num=0;
for(i=0;i<str.length;i++){
    if(str1.indexOf(str[i])=="-1"){
        str1+=str[i];
        num++;
    }
}
console.log(num);
  1. 数字颠倒
    描述
    输入一个整数,将这个整数以字符串的形式逆序输出
    程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001

输入描述:
输入一个int整数

输出描述:
将这个整数以字符串的形式逆序输出

let num=readline().split("").reverse().join("");
console.log(num)

5.字符串反转
描述
接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)

输入描述:
输入一行,为一个只包含小写字母的字符串。

输出描述:
输出该字符串反转后的字符串。

let str=readline();
let reg=/^([a-z]+)$/g;
if(reg.test(str)){
   var result=str.split("").reverse().join("");
   console.log(result);
}else{
    console.log("error,请检查输入")
}

6.句子逆序

描述
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符

输入描述:
输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。

输出描述:
得到逆序的句子

// 思路:先用空格把输入搞到手,然后再逆序输出
let arr=readline().split(" ").reverse().join(" ");
console.log(arr)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值