我有一个颜色的ArrayList和它们的出现频率。我的程序应该计算那些最大化两个相等砖块之间最小距离的项目的重新排序。
例如,给定输入由4 * brick 1(x),3 * brick 2(y)和5 * brick 3(z)组成,一个正确的输出将是:z y x z x z y x z x y。
我的代码没有产生好的解决方案。特别是,有时最后会有2块相同的砖块,这是最糟糕的情况。
<div v-for="(item,index) in dataArray" v-on:click="subMenu(item)" v-bind:id="'tile_'+index" class="card">
<div><img v-bind:src=item.menuLogo onerror="this.src='img/default.svg'" /></div>
<div>{{item.title}}</div>
<div>{{index+1}}</div>
</div>
let subhome = [
{"title":"sub_card_title","sub_cardimage":"sub_item1.png",data:[]},
{"title":"sub_card_title","sub_cardimage":"sub_item1.png",data:[]}, {"title":"sub_card_title","sub_cardimage":"sub_item1.png",data:[]},`
{"title":"sub_card_title","sub_cardimage":"sub_item1.png",data:[]}
]
let home = [
{"title":"card_title","cardimage":"item1.png",data:[]},
{"title":"card_title","cardimage":"item1.png",data:subhome}, {"title":"card_title","cardimage":"item1.png",data:[]},`
{"title":"card_title","cardimage":"item1.png",data:[]}
]
let menu = new Vue({
el: '#menu',
data: {
dataArray: home
},
methods: {
subMenu: function(item) {
if (item.data.length > 0) {
this.dataArray = item.data;
console.log('sub menu array -->', this.dataArray);
$('#menu-title').text(eval(item));
}
},setTitle: function(val) {
let title = eval(val); // <---- how to vaiable name of data array
$('#spancontainer').text(title)
}
}
});
如何让我的代码选择最佳订单?
答案 0 :(得分:1)
我们不会为您进行锻炼,但我们会给您一些建议。
考虑您当前的方法:通过在砖块中循环填充结果字符串来操作,只要任何项目保留在该砖块中,就可以依次从每个砖块中选择一个项目。但是当一块砖比任何其他砖包含至少两个物品时,这种方法肯定会失败,因为那时只有那块砖保留在最后,并且所有剩余的物品必须一个接一个地插入。
也就是说,问题不在于您的代码本身,而是您的整个策略对于问题不正确。你需要不同的东西。
现在,考虑问题本身。哪个项目会以正确的顺序以最短的距离出现?当然,频率最高的那些。您可以根据频率和项目总数计算出最小距离 假设您首先以已知的最佳距离排列这些最受约束的项目。
此时还有什么事要做?好吧,你可能会有更多频率较低的砖块,还有一些可以容纳物品的槽。如果您完全忽略占用的插槽,则可以将其视为您之前遇到的相同问题的较小版本。