前端面试可能遇见的程序大题 二(珠串问题)?附思路及代码答案。
题目: 一串首尾相连的珠子(m个),有n种颜色(n<=10),设计一个算法,取出其中一段,要求包含所有颜色,并使其长度最短。(js实现)
思路:颜色分别用0-9十个不同的数字代表,颜色随机<=10。定义一个长度为10的数组,遍历这串珠子,把对应颜色数字作为下标,并把对应下标值标为1。从下标0开始循环遍历,做同样赋值操作,直到两个数组相同跳出循环,比较长度输出较小者。当长度到达串珠尾部仍未找到相同数组时把下标重新调整遍历,做同样操作。注意首尾相连这点,可从下标着手,并注意内环循环变量关系。
代码 :(html & js)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>珠串问题优化</title>
</head>
<script type="text/javascript">
var arr = []
var m = 100; //自定义串珠总长度m
var a = new Array(10); //存放不重复颜色
//获取随机整数
function getRandomArr(start, end) {
return Math.floor(Math.random() * (end - start + 1) + start) //向下取整
}
for (k = 0; k < m; k++) {
arr.push(getRandomArr(0, 9)) //随机数范围在[0-9]
a[arr[k]] = 1;
}
a = a.toString();
console.log('初始示例珠串', arr)
find(arr)
function find(arr) {
var minLength = arr.length; //声明截取到所有颜色的最短长度minLength
var result = []; //存放结果
for (var j = 0; j < arr.length; j++) {
var newArr = new Array(10); //定义一个长度为10的新数组 不同的随机数把该对应数字下标赋为1
for (i = j; newArr.toString() !== a; i++) {
if (i == arr.length) //当珠串到达尾部仍未找到所有颜色数时,下标从头开始循环
i -= arr.length;
newArr[arr[i]] = 1;
if (newArr.toString() === a) {
if (i > j) {
var str = arr.slice(j, i + 1);
} else {
var str = arr.slice(j, arr.length).concat(arr.slice(0, i));
}
if (str.length < minLength) {
minLength = str.length
result = str;
}
}
}
}
console.log('最后结果', result, minLength);
}
</script>
<body>
</body>
</html>

浙公网安备 33010602011771号