- 合并表记录
描述
数据表记录包含表索引和数值(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))
- 字符个数统计
描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在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);
- 数字颠倒
描述
输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有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)