每隔n步循环删除,返回最后一个元素

题目:有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。



题解一: 暴力解法,模拟,一步一步来。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 int main(){
 5     int n; // 长度
 6     while(cin>>n){
 7         if(n>1000){
 8             n=1000;
 9         }
10         vector<int> v(n);
11         for(int i=0;i<n;i++){
12             v[i]=i;
13         }
14         vector<bool> v_b(n,false);
15
16         if(n==1){
17             return v[0];
18         }
19
20         int count=0; // 删除的count
21         int idx=-1;
22         while(count!=n-1){
23             int step=0;
24             while(step<3){
25                 idx=(idx+1)%n;
26                 if(v_b[idx]==false){
27                     step++;
28                 }
29             }
30             v_b[idx]=true;
31             count++;
32         }
33         for(;v_b[idx]==true;idx=(idx+1)%n){
34                     ;
35         }
36         cout<<v[idx]<<endl;
37     }
38     return 0;
39
40 }


题解二:运用队列的思想进行循环插入和删除。

 1 #include<queue>
 2 using namespace std;
 3 int main()
 4 {
 5     int n;
 6     while(cin>>n)
 7     {
 8         queue<int> q;
 9         for(int i=0;i<n;i++)
10         {
11             q.push(i);
12         }
13         int count=0;
14         while(q.size()!=1)
15         {
16             if(count!=2)
17             {
18                 int b=q.front();
19                 q.pop();
20                 q.push(b);
21                 count++;
22             }
23             else
24             {
25                 q.pop();
26                 count=0;
27             }
28         }
29         int c=q.front();
30         cout<<c<<endl;
31     }
32     return 0;
33 }


题解三: 约瑟夫环问题(以后再看)

 1 //递推公式:f[1] = 0 ,f[n] = (f[n - 1] + K) mod n //如果想了解:http://blog.csdn.net/taoyanqi8932/article/details/52335719
 2 #include <iostream>
 3 using namespace std;
 4 int lastNum(int n) {
 5     int res=0;
 6     for (int i=2;i<=n;i++)
 7         res=(res+3)%i;
 8     return res;
 9 }
10 int main() {
11     int n;
12     while (cin>>n)
13         cout<<lastNum(n)<<endl;
14 }

原文地址:https://www.cnblogs.com/yy-1046741080/p/12357983.html

时间: 2024-12-10 02:20:20

每隔n步循环删除,返回最后一个元素的相关文章

约瑟夫问题 算法很简单保证每隔人都能看懂用数组实现 利用循环删除数组中的元素

#include<iostream> using namespace std; const int size = 1000; void ArrDel() { int arr[size]; //循环结束标志,一直循环到数组中只剩下最后一个元素结束 int currentNum = size; int count = 0; for (int k = 0; k < size; k++) { arr[k] = k; } //currentNum==1表示数组中只剩下最后一个元素 是循环结束的标志

UITableView删除分组最后一个元素

UITableView删除分组最后一个元素,需要把分组同时删除. 1.首先在数据源上删除数据. 2.UI上删除cell: [tableView deleteRowsAtIndexPaths:[NSArrayarrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 3.删除数据源上分组的元素. 4.UI上删除分组元素: [tableView deleteSections:[NSIndexSetind

删除双向链表最后一个元素

初始化双向链表后使用尾插法插入元素,然后对插入的元素进行删除,发现不能删除链表最后一个元素... 控制台没反应,删除最后一个元素失败了,然后思考了几分钟,发现问题所在... 控制台正常输出,问题解决了... 原文地址:https://www.cnblogs.com/YLJ666/p/12252829.html

Java循环删除集合多个元素的正确打开方式

首先说下不正确的打开方式: 第一:使用for循环删除集合的元素,示例代码如下 1 ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); 2 for (int i = 0; i < list.size(); i++) { 3 list.remove(i); 4 } 5 System.out

[编程题]删除数组最后一个元素

删除数组 arr 最后一个元素.不要直接修改数组 arr,结果返回新的数组 输入例子: truncate([1, 2, 3, 4]) 输出例子: [1, 2, 3] //利用slice function truncate(arr) { return arr.slice(0,-1); } //利用filter function truncate(arr) { return arr.filter(function(v,i,ar) { return i!==arr.length-1; }); } //

JS函数:返回下一个元素节点

1 //寻找先一个元素节点的函数,把一个元素的下一个节点(nextSibing)作为参数传给该函数,经过筛选返回元素节点 2 function nextElementSiblings(node){ 3 if(node.nodeType == 1){ 4 return node; 5 } 6 if(node.nextSibling){ 7 return nextElementSiblings(node.nextSibling); 8 } 9 return null; 10 }

删除掉了一个元素后,数组的索引发生的变化,造成了程序的异常解决方法

sureRuleDelete () { this.deleteRuleDialog = false for ( let i=this.tableData.length; i>=0; i--){ this.selectionData.forEach( item => { if (item.fieid == i+1) { this.tableData.splice(i,1) } }) } } 原文地址:https://www.cnblogs.com/yiyiyurou/p/9774772.html

如何正确遍历删除List中的元素(普通for循环、增强for循环、迭代器iterator、removeIf+方法引用)

遍历删除List中符合条件的元素主要有以下几种方法: 普通for循环 增强for循环 foreach 迭代器iterator removeIf 和 方法引用 (一行代码搞定) 其中使用普通for循环容易造成遗漏元素的问题,增强for循环foreach会报java.util.ConcurrentModificationException并发修改异常. 所以推荐使用迭代器iterator,或者JDK1.8以上使用lambda表达式进行List的遍历删除元素操作. 以下是上述几种方法的具体分析: 1.

集合循环删除问题-报错java.util.ConcurrentModificationException解析

java.util.ConcurrentModificationException 异常问题详解 环境:JDK 1.8.0_111 在Java开发过程中,使用iterator遍历集合的同时对集合进行修改就会出现java.util.ConcurrentModificationException异常,本文就以ArrayList为例去理解和解决这种异常. 一.单线程情况下问题分析及解决方案 1.1 问题复现 先上一段抛异常的代码. 1 public void test1() { 2 ArrayList