1. 创建一个函数,接受两个或多个数组,返回所给数组的 对等差分(symmetric difference) (△ or ⊕)数组.
给出两个集合 (如集合 A = {1, 2, 3} 和集合 B = {2, 3, 4}), 而数学术语 “对等差分” 的集合就是指由所有只在两个集合其中之一的元素组成的集合(A △ B = C = {1, 4}). 对于传入的额外集合 (如 D = {2, 3}), 你应该安装前面原则求前两个集合的结果与新集合的对等差分集合 (C △ D = {1, 4} △ {2, 3} = {1, 2, 3, 4}).
- 去除单个数组重复的元素 delSame(a)
- 实现数组对等差分differ(a,b)
- 接收所有的参数,从0位置开始对等差分
function sym(a){
var arr =arguments[0];
for(var i=1;i<arguments.length;i++){ //用reduce
arr = differ(arr,arguments[i]);
}
return arr;
}
function differ(a,b) {
a = delSame(a);
b = delSame(b);
for(var i=0;i<a.length;i++) {
if(b.indexOf(a[i])!==-1) {
b.splice(b.indexOf(a[i]),1);
a.splice(i,1);
i--;
}
}
var arr = [];
for (i=0;i<a.length;i++){ //改成concat
arr.push(a[i]);
}
for (i=0;i<b.length;i++){
arr.push(b[i]);
}
return arr;
}
function delSame(a) { //filter 和 splice
var b = [];
for(var i=0;i<a.length;i++) {
if(b.indexOf(a[i])==-1)
b.push(a[i]);
}
return b;
}
sym([1, 1, 2, 5], [2, 2, 3, 5]);
2. 设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数.
cid 是一个二维数组,存着当前可用的找零.
当收银机中的钱不够找零时返回字符串 “Insufficient Funds”. 如果正好则返回字符串 “Closed”.
否则, 返回应找回的零钱列表,且由大到小存在二维数组中.
- 收银机零钱等于找零钱,直接返回 “Closed”
- 收银机零钱大于找零钱,直接返回"Insufficient Funds"
- 收银机零钱小于找零钱
- 从收银机大额的零钱开始比较
- 零钱的额度大于找零钱,continue
- 零钱的钱数=0,continue
- 找零钱=0,break
- 找零钱大于零钱的额度
- 大于对应的零钱 直接向 arr 插入[零钱的额度,值]
- 等于对应的零钱 直接向 arr 插入[零钱的额度,值] break
- 小于对应的零钱 向 arr 插入[零钱的额度,取整(找零钱 / 零钱的额度)*零钱的额度]
- 从收银机大额的零钱开始比较
function checkCashRegister(price, cash, cid) {
var change = cash - price;
var total=0;
for(var i=0;i<cid.length;i++){
total += cid[i][1];
}
if(change == total) return "Closed";
if(change > total) return "Insufficient Funds";
for (i in cid) {
switch (cid[i][0]){
case "PENNY":
cid[i].push(0.01);
break;
case "NICKEL":
cid[i].push(0.05);
break;
case "DIME":
cid[i].push(0.1);
break;
case "QUARTER":
cid[i].push(0.25);
break;
case "ONE":
cid[i].push(1);
break;
case "FIVE":
cid[i].push(5);
break;
case "TEN":
cid[i].push(10);
break;
case "TWENTY":
cid[i].push(20);
break;
case "ONE HUNDRED":
cid[i].push(100);
break;
}
}
var arr = [];
for(i=cid.length-1;i>=0;i--){
if(change<cid[i][2]||cid[i][1]===0||change===0) {
continue;
}else
if(cid[i][1]<=change){
arr.push([cid[i][0],cid[i][1]]);change-=cid[i][1];
}else{
var sub = Math.floor(100*change/(cid[i][2]*100))*cid[i][2];
arr.push([cid[i][0],sub]);
change =(Math.ceil(change*100) - sub*100)/100;
}
}
if(change!==0)return"Insufficient Funds";
return arr;
}
直接全部乘以100更方便,但是懒得改了,float计算精度乱了,直接最后向上取整。
3. 依照一个存着新进货物的二维数组,更新存着现有库存(在 arr1 中)的二维数组. 如果货物已存在则更新数量 . 如果没有对应货物则把其加入到数组中,更新最新的数量. 返回当前的库存数组,且按货物名称的字母顺序排列.
- 循环数组2的每一项
- 如果数组1存在,更新数量
- 不存在,比较位置
- 如果小于其中一项,splice(i,0,值)
- 都不小于,push到结尾
function updateInventory(arr1, arr2) {
// 请保证你的代码考虑到所有情况
arr2.map(function(val){
if(arr1.length===0) {
arr1.push(val); return true;
}
for(var i in arr1){
if(val[1]===arr1[i][1]) {
arr1[i][0]+=val[0];break;
}
if(val[1]<arr1[i][1])
{
arr1.splice(i,0,val);break;
}
if(i==arr1.length-1){
arr1.push(val);
}
}
});
return arr1;
}
别人的思路是插入数据存在增加数量,不存就push在结尾,最后整体排序