如何解决我对这个数据结构/算法问题的处理方式应该改变什么?
我正在练习数据结构和算法,遇到一个我坚持的问题。
您有一个输入数组,其中包含格式为“产品,销售量,价格”的元素。您需要返回一个数组,其中所有产品均按销售量排序。如果两种产品的销售额相同,请按最低价格对其进行排序。
我开始解决的方法是:
- 遍历数组,用逗号分割元素
- 将产品名称和价格添加到以销售额为关键的产品对象中
- 跟踪最大销售金额
- 从最大值开始,直到为零,如果有带有该键的产品,则将名称和价格推送到我的返回数组上
- 返回数组
这至少给了我按销售量排序的产品。但是,当我有售出相同数量的产品时,这是行不通的。如果商品的售价相同,我不确定是否有有效的方法可以按价格对商品进行排序。
任何人都知道如何实施价格排序?还是解决此问题的更好方法?
const items = [
'Chair,100,20','Sofa,70,200','Desk,80,120','Table,400,300','Fan,10,60','Pillow,40,5','Blanket,'Rug,'Mat,2,30','Stool,40','Comforter,200,250','Recliner,50,350',];
class Product {
constructor(name,price) {
this.name = name;
this.price = price;
}
}
const productList = (items) => {
let returnArray = [];
let products = {};
let max = 0;
for (let i = 0; i < items.length; i++) {
let productItems = items[i].split(',');
let product = new Product(productItems[0].trim(),productItems[2].trim());
let orderAmt = parseInt(productItems[1].trim());
products[orderAmt] = product;
max = Math.max(max,productItems[1]);
}
while (max > 0) {
if (products[max]) {
returnArray.push(`${products[max].name},${max},${products[max].price}`);
}
max--;
}
return returnArray;
};
console.log(productList(items));
.as-console-wrapper { min-height: 100%!important; top: 0; }
解决方法
... above comment中的单词具体化为代码...
const productItemList = [
'Chair,100,20','Sofa,70,200','Desk,80,120','Table,400,300','Fan,10,60','Pillow,40,5','Blanket,'Rug,'Mat,2,30','Stool,40','Comforter,200,250','Recliner,50,350',];
function getProductItemListAlignedBySoldAmountPriceAndName(itemList) {
function compareAlphaNumericalAscending(a,b) {
return (((a < b) && -1) || ((a > b) && 1) || 0);
}
function compareAlphaNumericalDescending(a,b) {
return (((a > b) && -1) || ((a < b) && 1) || 0);
}
function compareNames(a,b) {
return (
(a.localeCompare && b.localeCompare)
? a.localeCompare(b)
: compareAlphaNumericalAscending(a,b)
);
}
function compareProductItemsByAmountSoldPriceAndName(a,b) {
return (
compareAlphaNumericalDescending(a.sold,b.sold)
|| compareAlphaNumericalAscending(a.price,b.price)
|| compareNames(a.name,b.name)
);
}
function createProductItem(template) {
const [name,sold,price] = template.split(/\s*,\s*/);
return {
name,sold: parseInt(sold,10),price: parseInt(price,template
};
}
function getProductItemTemplate(item) {
return item.template;
}
return itemList
.map(createProductItem)
.sort(compareProductItemsByAmountSoldPriceAndName)
.map(getProductItemTemplate);
}
console.log(getProductItemListAlignedBySoldAmountPriceAndName(productItemList));
.as-console-wrapper { min-height: 100%!important; top: 0; }
@ Cineno28 ...从上面函数的最后几行可以看出,原来的方法已经指向了正确的方向...
- 将每个产品项的字符串模板形式映射到基于键值的真实产品项中(也保留字符串模板)。
- 通过将相应的属性值以正确的顺序(
sold
,price
,name
)相互比较来对临时项数组进行排序。 - 通过映射回
template
属性来恢复每个产品项目的原始形式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。