前端基础知识与常见面试题(九)

描述
现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ;
每种砝码对应的数量为 x1,x2,x3...xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。


注:

称重重量包括 0
输入描述:
对于每组测试数据:
第一行:n --- 砝码的种数(范围[1,10])
第二行:m1 m2 m3 ... mn --- 每种砝码的重量(范围[1,2000])
第三行:x1 x2 x3 .... xn --- 每种砝码对应的数量(范围[1,10])
输出描述:
利用给定的砝码可以称出的不同的重量数
示例:
输入:
2
1 2
2 1
输出:
5
说明:
可以表示出0,1,2,3,4五种重量。
解:
let line1 = readline();let line2 = readline();let line3 = readline();
let m = line2.split(' '); //每种砝码的重量
let x = line3.split(' '); //每种砝码对应的数量范围
let fama = []            //序列化砝码,比如两个1g和一个2g的砝码用[1,1,2]表示
for (let i = 0; i < m.length; i++) {
    for (let j = 0; j < x[i]; j++) {
        fama.push(Number(m[i]))
    }
}
let kind = new Set();    //用set表示加入当前砝码之前能产生的重量种类
kind.add(0);            //set初始化为0
// 当第一个1g砝码放入时,set中要插入原先所有元素+1g后的结构,即{0,0+1},插入后变为{0,1}
// 当第二个1g砝码放入时,set要插入{0+1,1+1},变为{0,1,2}
// 第三个2g砝码放入时,set要插入{0+2,1+2,2+2},变为{0,1,2,3,4}
for (let i = 0; i < fama.length; i++) {
    let arr = [...kind]    //用一个数组来缓存当前种类的砝码的值
    for (let k of arr) {
        kind.add(k + fama[i]);
    }
}
console.log(kind.size)
——————————————————————
描述
正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

数据范围:1 \le a,b \le 100000 \ 1≤a,b≤100000 
输入描述:
输入两个正整数A和B。

输出描述:
输出A和B的最小公倍数。
输入:5 7
输出:35
解:let arr=readline().split(' ').sort((a,b)=> a-b)
let res=[]
let n=arr[1]
while(!(n%arr[0]==0 && n%arr[1]==0)){
    n++
}
console.log(n)
————————————————————
描述
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。

数据范围:输入的数据满足 4 \le n \le 1000 \ 4≤n≤1000 
输入描述:
输入一个大于2的偶数

输出描述:
从小到大输出两个素数
示例1
输入:20

输出:
7
13
示例2
输入:4

输出:
2
2
解:let num=readline()
let res=[]
let arr={}
    for(var j=num;j>1;j--){
        arr[j]=[]
        for(var i=2;i<num;i++){
            if(j%i==0){
                arr[j].push(i)
            }
        }        
}
for(var k in arr){
  if ( arr[k].length==1){
      res.push(k)
  }
}
let obj={}
for(var i=0;i<res.length;i++){
  for(var j=res.length-1;j>=i;j--){
      if(res[i]*1+res[j]*1==num){
          obj[(`${res[j]}-${res[i]}`)]=(`${res[j]-res[i]}`)
      }    
  }     
}
let min=num
for(var k in obj){
    min=Math.min(min,obj[k])
}
for(var k in obj){
    if(obj[k]==min){
       let hh=k.split('-')
        console.log(hh[1])
        console.log(hh[0])
    }
}
————————————————————————————
//第一题3空瓶换气水,两个空瓶可以和老板借一瓶,最多能换多少瓶汽水
// let num = 1;
// let sum = 0;
// function ping(e) {
//   let n = parseInt(e / 3);
//   let m = e % 3;
//   if (n !== 0) {
//     sum += n;
//     let i = n + m;
//     ping(i);
//   }
//   if (n == 0 && m == 2) {
//     sum = sum + 1;
//     console.log(sum);
//   }
//   if (n == 0 && (m == 0 || m == 1)) {
//     console.log(sum);
//   }
// }
// ping(num);
——————————————————————————————
题目描述
小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。

当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。

小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。

输入描述:
抓取的糖果数(<10000000000):15

输出描述:
最少分至一颗糖果的次数:5

示例 1
输入:15
输出:5

解释:
(1) 15+1=16;
(2) 16/2=8;
(3) 8/2=4

(4)4/2=2

(5)2/2=1
解:let num = 15;
let arr = [];
function f(e, sum) {
  if (e == 1) {
    arr.push(sum);
    return;
  }
  if (e % 2 == 0) {
    sum++;
    f(e / 2, sum);
  } else {
    sum++;
    f(e - 1, sum);
    f(e + 1, sum);
  }
}
f(num, 0);
arr.sort((a, b) => a - b);
console.log(arr[0]);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值