机试算法题-打印机队列

题目:

某个打印机根据打印队列执行打印任务。打印任务分为九个优先级,分别采用数字1~9表示,数字越大优先级越高。打印机每次从队列头部取出第一个任务A,然后检查队列余下任务中有没有比A优先级更高的任务,如果有比A优先级高的任务,则将任务A放到队列尾部,否则执行任务A的打印。请编写一个程序,根据输入的打印队列,输出实际打印顺序。

输出描述:

1、输入:’8,9,10‘
输出:’2,1,0‘

2、输入:’5,7,6,4‘
输出:‘1,2,0,3’

3、输入:‘8,7,8,6’
输出:‘0,2,1,3’

思路:

1、创建一个数组,从大到小排序,根据这个排序好的数组遍历,找到当前最大的元素的下标,把下标push到要输出的数组中来。
2、再创建一个数组,保存每次找到一个元素后要重新排列一次数组。防止输出为:‘8,7,8,7’,这种重复元素的情况。(按这个输入,最后输出应该为‘0,2,3,1’),因为下标为1的’7‘,因为不够下标为2的‘8’大,所以会被放到数组最后面。所以每次输出一个元素后要保存当前数组。

代码:

	<script>
		const str='1,3,2,4'

		function printPrinter(str) {
			if(str.length<=1){return 0}
			let arr = str.split(","); //最初数组
			let arr2 = [...arr] //排序后的数组
			let arr3 = [...arr] //当前数组
			let index = [] //当前数组下标
			let indexArr = [] //输出数组
			let d1 = null //交换中介
			
			for(let i=0;i<arr2.length;i++){
				index.push(i)
			}//给下标数组赋值

			arr2.sort((a,b)=>{return b-a}) //对arr2逆序排序
			
			console.log(arr2,arr3,index,indexArr)
			
			for(let i=0;i<arr2.length;i++){//遍历排序后等数组
					console.log(arr3)
				while(arr2[i] !== arr3[0]){//如果当前数组的头部大小不等于排序后数组等arr2[i],把当前数组和下标放到数组的最后面。
					d1 = arr3[0]
					arr3.shift()
					arr3.push(d1)
						
					d1 = index[0]		
					index.shift()
					index.push(d1)
				}
				//如果相等的话把下标放到输出结果的数组中,然后在当前数组和当前数组下标中把头丢出去。
				indexArr.push(index[0])
				arr3.shift()
				index.shift()
			}
			return indexArr.join()
		}
		console.log(printPrinter(str))
	</script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值