实现评分与消息关联:将评分范围分割为非均等子区间
实现动态评分区间与消息的关联映射
需要实现一个函数,将1~ratingRange的动态评分映射到长度可变的消息数组,每个消息对应一个非均等但尽可能均匀分布的评分区间。比如评分范围10、4条消息时,区间划分为[1-3,4-6,7-8,9-10],分别对应"Bad","Okay","Good","Amazing"。
解决方案
核心思路是先计算每个区间的基础长度,再将余数分配给前N个区间(N为余数),让前几个区间多1个评分值,保证整体分布均匀。通过遍历累计区间长度,找到当前评分所在的区间,返回对应消息。
function getMessageByRating( ratingRange: number, messagesArray: string[], currentRating: number ): string { const messageCount = messagesArray.length; if (messageCount === 0) return ''; if (currentRating < 1) return messagesArray[0]; if (currentRating > ratingRange) return messagesArray[messageCount - 1]; const baseIntervalLength = Math.floor(ratingRange / messageCount); const remainder = ratingRange % messageCount; let cumulativeEnd = 0; for (let i = 0; i < messageCount; i++) { const intervalLength = baseIntervalLength + (i < remainder ? 1 : 0); cumulativeEnd += intervalLength; if (currentRating <= cumulativeEnd) { return messagesArray[i]; } } return messagesArray[messageCount - 1]; }
测试验证
以下测试用例均符合预期:
// 评分范围5,3条消息 getMessageByRating(5, ['Bad', 'Okay', 'Good'], 2); // 'Bad' getMessageByRating(5, ['Bad', 'Okay', 'Good'], 4); // 'Okay' getMessageByRating(5, ['Bad', 'Okay', 'Good'], 5); // 'Good' // 评分范围10,3条消息 getMessageByRating(10, ['Bad', 'Okay', 'Good'], 4); // 'Bad' getMessageByRating(10, ['Bad', 'Okay', 'Good'], 5); // 'Okay' getMessageByRating(10, ['Bad', 'Okay', 'Good'], 7); // 'Okay' getMessageByRating(10, ['Bad', 'Okay', 'Good'], 8); // 'Good' // 评分范围10,4条消息 getMessageByRating(10, ['Bad', 'Okay', 'Good', 'Amazing'], 3); // 'Bad' getMessageByRating(10, ['Bad', 'Okay', 'Good', 'Amazing'], 4); // 'Okay' getMessageByRating(10, ['Bad', 'Okay', 'Good', 'Amazing'], 6); // 'Okay' getMessageByRating(10, ['Bad', 'Okay', 'Good', 'Amazing'], 7); // 'Good' getMessageByRating(10, ['Bad', 'Okay', 'Good', 'Amazing'], 8); // 'Good' getMessageByRating(10, ['Bad', 'Okay', 'Good', 'Amazing'], 9); // 'Amazing'
逻辑说明
- 边界处理:提前处理空消息数组、评分低于1或超过
ratingRange的情况,避免逻辑出错。 - 区间计算:
baseIntervalLength:每个区间的基础长度,由评分范围除以消息数取整得到。remainder:评分范围除以消息数的余数,将这部分额外的评分值分配给前remainder个区间,每个区间长度加1。
- 区间匹配:遍历累计每个区间的结束值,当当前评分落在该区间内时,返回对应的消息。
内容的提问来源于stack exchange,提问作者CoJanks
相关产品推荐
相关产品推荐

