题目一 删除字符串中出现次数最少的字符(HJ23)
JavaScript Node ACM 模式
javascript
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// Write your code here
while ((line = await readline())) {
let arr = line.split("");
let obj = {};
arr.forEach((item) => {
if (obj[item] != undefined) {
obj[item]++;
} else {
obj[item] = 1;
}
});
let min = 21;
for (let key in obj) {
min = Math.min(min, obj[key]);
}
for (let key in obj) {
if (min == obj[key]) {
arr.forEach((item, index) => {
if(item == key){
arr.splice(index,1)
}
});
}
}
console.log(arr.join(''))
}
})();
知识笔记
① Math.min()
console.log(Math.min(-1, 4, 6, 12));//输出值:-1
题目二 字符串排序(HJ26)
JavaScript Node ACM 模式
javascript
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// Write your code here
while ((line = await readline())) {
let result = line.split("");
//先收集英文字母,对其进行排序
let words = line.match(/[a-z]+/gi).join("").split("");
words.sort(function (a, b) {
a = a.toLowerCase();
b = b.toLowerCase(); //规则1 不区分大小写
return a < b ? -1 : 0; //升序排列(因为前面全都转化成小写,故不会改变同一字母大小写的相对顺序)
});
console.log('words',words)
result.forEach((item, index) => {
//将words中字母替换result中的字母,非英文字符不替换
if (/[a-z]/i.test(item)) {
//是英文字符,则替换
result[index] = words[0];
words.shift();
}
});
console.log(result.join(""));
}
})();
知识笔记:
解题代码借鉴的讨论区的大佬的。
大概梳理下这个想法。
① 题目理解:
将所有的字母,不区分大小写,按照从a-z排列,然后按照原文的格式输出。
② 思路解读:
1)提取所有的字母,然后按照a-z排列;
2)按照原字符串的位置序列,进行填充;
比较容易忽略的点:正则的函数。
题目三 HJ27 查找兄弟单词
JavaScript Node ACM 模式
javascript
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// Write your code here
let arrline = [];
while ((line = await readline())) {
arrline = line.split(" ");
}
let _n = Number(arrline[0]); // 第一个是表示有多少个单词;
let _allword = arrline.slice(1, _n); // 单词字典
let _keyword = arrline[_n + 1]; // 关键单词
let _index = arrline[arrline.length - 1]; // k
let _keyarr = [];
_keyarr = _keyword.split(""); // 关键词的数组;
function permuteArray(arr) {// 获取全排列
if (arr.length === 1) {
return [arr];
}
const result = [];
for (let i = 0; i < arr.length; i++) {
const currentElement = arr[i];
const remainingElements = arr.slice(0, i).concat(arr.slice(i + 1));
const permutations = permuteArray(remainingElements);
for (const permutation of permutations) {
result.push(([currentElement].concat(permutation)).join(''));
}
}
return result;
}
let _broarr = [];// 兄弟数组
const permutations = permuteArray(_keyarr);
_allword.forEach((item)=>{
if(permutations.indexOf(item) != -1){// 兄弟数组重组
_broarr.push(item)
}
})
console.log(_broarr.length);
if(_broarr[_index] != undefined && _broarr[_index] != null){
console.log(_broarr[_index])
}
})();
知识笔记:
需要注意的点就是,数组的全排列。
javascript
function permuteArray(arr) {// 获取全排列
if (arr.length === 1) {
return [arr];
}
const result = [];
for (let i = 0; i < arr.length; i++) {
const currentElement = arr[i];
const remainingElements = arr.slice(0, i).concat(arr.slice(i + 1));
const permutations = permuteArray(remainingElements);
for (const permutation of permutations) {
result.push(([currentElement].concat(permutation)).join(''));
}
}
return result;
}
大概思路就是,获取单词x的单字母全排列,然后在字典单词中匹配,然后挑出来。
然后输出。
题目四 HJ29 字符串加解密
JavaScript Node ACM 模式
javascript
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// Write your code here
let twoarr = [];
while ((line = await readline())) {
twoarr.push(line);
}
let linearr = twoarr[0].split("");// 加密
let _newarr = [];
linearr.forEach((item) => {
if (/[a-z]/.test(item)) {
if (item == "z") {
_newarr.push("A");
} else {
_newarr.push(
String.fromCharCode(item.charCodeAt(0) + 1).toUpperCase()
);
}
} else if (/[A-Z]/.test(item)) {
if (item == "Z") {
_newarr.push("a");
} else {
_newarr.push(
String.fromCharCode(item.charCodeAt(0) + 1).toLowerCase()
);
}
} else if (/[0-9]/.test(item)) {
if (item == 9) {
_newarr.push(0);
} else {
_newarr.push(Number(item) + 1);
}
}
});
let _linearr = twoarr[1].split("");// 解密
let newarr = [];
_linearr.forEach((item) => {
if (/[a-z]/.test(item)) {
if (item == "a") {
newarr.push("Z");
} else {
newarr.push(
String.fromCharCode(item.charCodeAt(0) - 1).toUpperCase()
);
}
} else if (/[A-Z]/.test(item)) {
if (item == "A") {
newarr.push("z");
} else {
newarr.push(
String.fromCharCode(item.charCodeAt(0) - 1).toLowerCase()
);
}
} else if (/[0-9]/.test(item)) {
if (item == 0) {
newarr.push(9);
} else {
newarr.push(Number(item) - 1);
}
}
});
console.log(_newarr.join(""));
console.log(newarr.join(""));
})();
知识笔记:
① 正则验证:test()方法,/[0-9]/验证是否是从1到9,/[a-z]/验证是否是从a-z;
② 大小写转化,toUpperCase()转大写,toLowerCase()转小写;
③ ASCII码转字符String.fromCharCode();
④ 字符转ASCII码string.charCodeAt();
题目五 HJ30 字符串合并处理
描述
按照指定规则对输入的字符串进行处理。
详细描述:
第一步:将输入的两个字符串str1和str2进行前后合并。如给定字符串 "dec" 和字符串 "fab" , 合并后生成的字符串为 "decfab"
第二步:对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标的意思是字符在字符串中的位置。注意排序后在新串中仍需要保持原来的奇偶性。例如刚刚得到的字符串"decfab",分别对下标为偶数的字符'd'、'c'、'a'和下标为奇数的字符'e'、'f'、'b'进行排序(生成 'a'、'c'、'd' 和 'b' 、'e' 、'f'),再依次分别放回原串中的偶数位和奇数位,新字符串变为"abcedf"
第三步 :对排序后的字符串中的'0'~'9'、'A'~'F'和'a'~'f'字符,需要进行转换操作。
转换规则如下:
对以上需要进行转换的字符所代表的十六进制用二进制表示并倒序,然后再转换成对应的十六进制大写字符(注:字符 a~f 的十六进制对应十进制的10~15,大写同理)。
如字符 '4',其二进制为 0100 ,则翻转后为 0010 ,也就是 2 。转换后的字符为 '2'。
如字符 '7',其二进制为 0111 ,则翻转后为 1110 ,对应的十进制是14,转换为十六进制的大写字母为 'E'。
如字符 'C',代表的十进制是 12 ,其二进制为 1100 ,则翻转后为 0011,也就是3。转换后的字符是 '3'。
根据这个转换规则,由第二步生成的字符串 "abcedf" 转换后会生成字符串 "5D37BF"。
数据范围:输入的字符串长度满足 1 \le n \le 100 \1≤n≤100
输入描述 :
样例输入两个字符串,用空格隔开。
输出描述:
输出转化后的结果。
JavaScript Node ACM 模式
javascript
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// Write your code here
while ((line = await readline())) {
let strarr = line.split(" ").join("").split("");
let onearr = []; // 奇数数组;
let twoarr = []; // 偶数数组;
strarr.forEach((item, index) => {
if (index % 2 == 0) {
twoarr.push(item);
} else {
onearr.push(item);
}
});
onearr = onearr.sort((a, b) => a.charCodeAt() - b.charCodeAt());
twoarr = twoarr.sort((a, b) => a.charCodeAt() - b.charCodeAt());
let _str = [];
let len = onearr.length > twoarr.length ? onearr.length : twoarr.length;// 看谁length大,就用谁的长度来遍历
for (let i = 0; i < len; i++) {// 遍历将两个数组合并到一起
if (twoarr[i] != undefined) {
_str.push(twoarr[i]);
}
if (onearr[i] != undefined) {
_str.push(onearr[i]);
}
}
let resultarr = [];
_str.forEach((item) => {
if (/[a-f]/i.test(item) || /[0-9]/.test(item)) {// 如果是a-f,0-9 则处理下
let _item = parseInt(item, 16).toString(2);// 先转成2进制
if (_item.length < 4) {
for (let i = _item.length; i < 4; i++) {
_item = "0" + _item.toString();// 补0
}
}
_item = _item.split("").reverse().join("");// 反转
_item = parseInt(_item, 2).toString(16);
if (/[a-z]/.test(_item)) {
_item = _item.toUpperCase();
}
resultarr.push(_item);
}else{
resultarr.push(item);
}
});
console.log(resultarr.join(""));
}
})();
知识笔记:
读题很重要。
题目六 HJ31 单词倒排
JavaScript Node ACM 模式
javascript
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function () {
// Write your code here
while(line = await readline()){
let linearr = line.split('');
let _arr = []
linearr.forEach((item)=>{
if(/[a-z]/i.test(item)){
_arr.push(item)
}else{
_arr.push(" ")
}
})
let _str = _arr.join('')
_arr = _str.split(" ")
_arr.forEach((item)=>{
item = item.split('').reverse().join('')
})
console.log(_arr.reverse().join(' '))
}
}()
题目七 HJ32 密码截取
JavaScript Node ACM 模式
javascript
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// Write your code here
while ((line = await readline())) {
let value = "";
value = line;
let len = 0;
// 写一个判断是否是回文字串的方法
const func = (val) => {
const i = 0,
j = val.length - 1;
if (val[i] === val[j]) {
if (j - i <= 2) {
return true;
}
const sub = val.substring(i + 1, j);
if (func(sub)) {
return true;
}
return false;
} else {
return false;
}
};
// 遍历各种可能出现的组合,寻找最长回文字串
for (let i = 0; i < value.length; i++) {
for (let j = i + 1; j <= value.length; j++) {
const sub = value.substring(i, j);
if (func(sub)) {
if (sub.length > len) {
len = sub.length;
}
}
}
}
console.log(len);
}
})();
思考:
找最长的回文字符串。
比较重要的代码
javascript
// 写一个判断是否是回文字串的方法
const func = (val) => {
const i = 0,
j = val.length - 1;
if (val[i] === val[j]) {
if (j - i <= 2) {
return true;
}
const sub = val.substring(i + 1, j);
if (func(sub)) {
return true;
}
return false;
} else {
return false;
}
};
题目八 HJ33 整数与IP地址间的转换
描述
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
数据范围:保证输入的是合法的 IP 序列
JavaScript Node ACM 模式
javascript
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function () {
// Write your code here
while(line = await readline()){
let _arr = []
if(line.indexOf('.')!=-1){// 判断输入的是IP地址还是数字
// ip地址
_arr = line.split('.');
let _2arr = []
_arr.forEach((item)=>{
let _2str = eval(item).toString(2);
if(_2str.length<8){
for(let i = _2str.length;i<8;i++){
_2str = "0" + _2str;// 补足8位2进制
}
}
_2arr.push(_2str)
})
console.log(parseInt(_2arr.join(''), 2))
}else{
// 数字
_arr = eval(line).toString(2)
if(_arr.length < 32){
for(let i = _arr.length;i<32;i++){
_arr = "0" + _arr// 补足32位2进制
}
}
let _2numarr = []
for(let i = 0;i<4;i++){
let _item = _arr.substring(i*8,(i+1)*8 )// 截取
_2numarr.push(parseInt(_item, 2))
}
console.log(_2numarr.join('.'))
}
}
}()
题目九 HJ34 图片整理
JavaScript Node ACM 模式
javascript
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function () {
// Write your code here
while(line = await readline()){
let arr = line.split('')
let _arr = arr.sort()
console.log(_arr.join(''))
}
}()
就一个排序sort()
题目十 HJ38 求小球落地5次后所经历的路程和第5次反弹的高度
牛客网的题目难度参考下就行,不要较真。
JavaScript Node ACM 模式
javascript
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// Write your code here
while ((line = await readline())) {
let _n = Number(line);
let _all = 0;
for (let i = 1; i <= 5; i++) {
_all = _all + (Math.pow(2, -i) + Math.pow(2, -i + 1)) * _n;
}
_all = _all - Math.pow(2, -5) * _n
console.log(_all);
console.log(Math.pow(2, -5) * _n);
}
})();
思考:
这是数学的应用题,让你用代码的形式写出来,看来还是要多看数学呀。
大概落下过程是:
原始是n;
第一次落地,经历n;
第二次落地,经历1/2*n的弹起,加上1/4n的落下,即(1/2+1/4)n,2^(-1) * n + 2^(-2) * n ;
第三次落地,经历1/8 n的弹起,加上1/16n的落下,即(1/8+1/16)*n,2^(-3) * n + 2^(-4) * n;
......
第 i 次落地,经历2^(-i) * n + 2^(-i-1) * n;
总的长度就是n + 2^(-1) * n + 2^(-2) * n +2^(-3) * n + 2^(-4) * n + ......+2^(-i) * n + 2^(-i-1) * n;
搞个for循环遍历下;