做vi 设计国外网站,湖州培训网站建设网络营销,如何开设一个微信公众号,广州seo顾问seocnm目录
分苹果
题目描述
输入描述
输出描述
示例1
输入
输出
备注
示例2
输入
输出
解析
答案
字符统计及重排
题目描述
输入描述
输出描述
示例1
输入
输出
说明
示例2
输入
输出
说明
解析
答案
高矮个子排队
题目描述
输入描述
输出描述
备注…目录
分苹果
题目描述
输入描述
输出描述
示例1
输入
输出
备注
示例2
输入
输出
解析
答案
字符统计及重排
题目描述
输入描述
输出描述
示例1
输入
输出
说明
示例2
输入
输出
说明
解析
答案
高矮个子排队
题目描述
输入描述
输出描述
备注
示例1
输入
输出
示例2
输入
输出
说明
示例3
输入
输出
说明
解析
答案 分苹果
考察二进制的异或操作。
题目描述
B两个人把苹果分成两堆A希望按照他的计算规则等分苹果他的计算规则是按照二进制加法计算并且不计算进位1259110001019B的计算规则是十进制加法包括正常进位B希望在满足A情况下获取苹果重量最多。输入苹果的数量和每个苹果重量输出满足A的情况下B获取的苹果总重量。如果无法满足A的要求输出-1.
1总苹果数量20000
1每个苹果重量10000
输入描述
输入第一行是苹果数量3
输入第二行是每个苹果重量 3 5 6
输出描述
输出第一行是B获取的苹果总重量11
示例1
输入
3
3 5 6
输出
11
备注
按照A的计算方法563101110不算进位的话值为3
示例2
输入
8
7258 6579 2602 6716 3050 3564 5396 1773
输出
35165
解析
首先要求清楚A的加法实际上就是异或操作即1和0才等于11和1与0和0都是为0。
这里要通过具体实例观察例如3 56每次满足A的要求等式两边相等当两边二进制相等时两边的数异或等于0即所有的数异或为0时可以满足A的要求。
在满足A的要求情况下减去一个最小的数既可以满足B的要求。
答案
function dispenseApple(...args) {if (args.length 1) {return -1}// 从小到大排序args.sort((a, b) a - b)// 所有的数异或为0才可以按A的规则等分if (!args.reduce((t, v) t ^ v)) {// 所有数相加后减去最小的数let t args.reduce((t, v) t v)return t - args[0]}return -1
}
console.log(dispenseApple(3, 5, 6))
console.log(dispenseApple(7258, 6579, 2602, 6716, 3050, 3564, 5396, 1773)) 字符统计及重排
考察排序hash。
题目描述
给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数,并按照字母出现次数从大到小的顺序输出各个字母及其出现次数。 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。,
输入描述
输入一行,为一个仅包含字母的字符串。
输出描述
按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分隔,注意末尾的分号;字母和次数间用英文冒号分隔。
示例1
输入
xyxyXX
输出
x2y:2;X:2;
说明
每个字符出现的个数都是2故x排在y之前二小写字符x在X之前。
示例2
输入
abababb
输出
b:4;a:3;
说明
B的出现个数比a多故b排在a之前。
解析
用一个数组记录每个字符的出现次数和顺序。例如这种[{value:x,count:1},{value:y,count:2}]然后用一个hash对象通过字符指向该数组中的对象每出现一个新字符就在数组中添加一个对象并hash中记录旧的就通过hash找到对象增加count。最后排序输出。
答案
function resortString(str) {let hash {}let arr []// 用arr数组记录每个字符的出现次数按自然顺序排列for (tmp of str) {if (hash[tmp]) {hash[tmp].count} else {hash[tmp] {value: tmp,count: 1}arr.push(hash[tmp])}}// 由于arr之前是按自然顺序排列的这里只需要将次数大的往前排arr.sort((a, b) b.count - a.count)return arr.reduce((t, v) t ${v.value}:${v.count};, )
}
console.log(resortString(xyxyXX))
console.log(resortString(abababb)) 高矮个子排队
观察规律。
题目描述
现在有一队小朋友他们高矮不同我们以正整数数组表示这一队小朋友的身高如数组{5,3,1,2,3}。
我们现在希望小朋友排队以“高”“矮”“高”“矮”顺序排列每一个“高”位置的小朋友要比相邻的位置高或者相等每一个“矮”位置的小朋友要比相邻的位置矮或者相等要求小朋友们移动的距离和最小第一个从“高”位开始排输出最小移动距离即可。
例如在示范小队{5,3,1,2,3}中{5,1,3,2,3}是排序结果。{5,2,3,1,3}虽然也满足“搞”“矮”“高”“矮”顺序排列但小朋友们的移动距离大所以不是最优结果。
移动距离的定义如下所示第二位小朋友移到第三位小朋友后面移动距离为1若移动到第四位小朋友后面移动距离为2。
输入描述
排序前的小朋友以英文空格的正整数
4 3 5 7 8
小朋友100个
输出描述
排序后的小朋友以英文空格分割的正整数
4 3 7 5 8
备注
4高3矮7高5矮8高输出结果为最小移动距离只有5和7交换了位置移动距离都是1
示例1
输入
4 1 3 5 2
输出
4 1 5 2 3
示例2
输入
1 1 1 1 1
输出
1 1 1 1 1
说明
相邻位置可以相等
示例3
输入
xxx
输出
[]
说明
出现非法参数情况,返回空数组
解析
这里注意要求小朋友的移动距离最小故相邻的移动最好。这里举一个示例
...5,2,3,1X1X2...假设3前面的都符合要求这时比较到1了1与X1比较当1X1时即X1应该和1交换顺序前面依然符合3X1如果X11则不需要变顺序。
由此可以得出当为奇数时当前数比下一个数小则交换顺序为偶数时当前数比下一个数大则交换顺序。
答案
function tallShortSort(...args){if(args.some(v!Number.isInteger(v))){return []}let len args.lengthif(len0){return []}if(len 1){return args[0]}for(let i0;ilen-1;i){// 为偶数时当前数比下一个数大则交换顺序。if(i%20args[i]args[i1]){changeTwo(args,i,i1)}// 为奇数时当前数比下一个数小则交换顺序if(i%21args[i]args[i1]){changeTwo(args,i,i1)}}return args.join( )
}
// 交换顺序
function changeTwo(arr,a,b){let tmp tmp arr[b]arr[b] arr[a]arr[a] tmp
}console.log(tallShortSort(4,3,5,7,8))
console.log(tallShortSort(5,3,1,2,3))
console.log(tallShortSort(1,1,1,1,1))
console.log(tallShortSort(x,x,x))