1. 把数组中的每个数循环右移n位,要求时间复杂度O(n),空间复杂度O(1)
package cn.lifx.test;
public class RightMove
{
public static void main(String[] args)
{
int n = 10;
int m = 3;
int[] arr = new int[n];
for(int i=0; i<arr.length; i++)
{
arr[i] = i;
}
RightMove rm = new RightMove();
rm.Move(arr, m);
rm.Move2(arr, m);
}
//时间复杂度为O(n),空间复杂度O(1)
public void Move(int[] arr, int n)
{
int len = arr.length-1;
int mid = arr.length/2;
int temp = 0;
for(int i=0; i<mid; i++)
{
temp = arr[i];
arr[i] = arr[len-i];
arr[len-i] = temp;
}
mid = n/2;
for(int i=0; i<mid; i++)
{
temp = arr[i];
arr[i] = arr[n-i-1];
arr[n-i-1] = temp;
}
mid = (arr.length - n)/2 + n;
for(int i=n; i<mid; i++)
{
temp = arr[i];
arr[i] = arr[len-i+n];
arr[len-i+n] = temp;
}
Display(arr);
}
//时间复杂度为O(n*m),空间复杂度O(1)
public void Move2(int[] arr, int n)
{
int len = arr.length - 1;
int temp = 0;
for(int i=0; i<n; i++)
{
temp = arr[len];
for(int j=len; j>0; j--)
{
arr[j] = arr[j-1];
}
arr[0] = temp;
}
Display(arr);
}
public void Display(int[] arr)
{
System.out.println();
for(int i=0; i<arr.length; i++)
{
System.out.print(arr[i] + " ");
}
}
}
2. n个人围成一圈,序号依次为0到n-1,从第一个开始报数,到第m个人时他出列,然后从下一个人开始从0计数。问最后一个出列的是谁。
package cn.lifx.test;
import java.util.LinkedList;
public class DeleteNum
{
public static void main(String[] args)
{
int N = 6;
int M = 4;
DeleteNum delete = new DeleteNum();
int[] arr = new int[N];
for(int i=0; i<arr.length; i++)
{
arr[i] = i;
}
delete.Delete(arr, N, M);
LinkedList<String> list = new LinkedList<String>();
for(int i=0; i<N; i++)
{
list.add(i+"");
}
delete.Delete(list, N, M);
}
public void Delete(int[] arr, int N, int M)
{
boolean[] flags = new boolean[arr.length];
for(int i=0; i<flags.length; i++)
{
flags[i] = false;
}
int sum = 0;
int count = 0;
int i = 0;
System.out.print("The deleted numbers are: ");
while(sum != N - 1)
{
if(!flags[i%N])
{
count++;
if(count == M)
{
sum++;
count = 0;
flags[i%N] = true;
System.out.print(arr[i%N] + " ");
}
}
i++;
}
for(i=0; i<flags.length; i++)
{
if(!flags[i])
{
System.out.println("\nThe last number is : " + arr[i]);
break;
}
}
}
public void Delete(LinkedList<String> list, int N, int M)
{
int i = 0;
int sum = 0;
int count = 0;
System.out.print("The deleted numbers are: ");
while(sum != N-1)
{
count++;
if(count == M)
{
System.out.print(list.remove(i%list.size()) + " ");
i--;
sum++;
count = 0;
}
i++;
if(i == list.size())
{
i = 0;
}
}
System.out.println("\nThe last number is : " + list.getFirst());
}
}
分享到:
相关推荐
分别用数组和链表解决约瑟夫环问题。 数组和链表.doc
这是用数组表示循环链表,解决约瑟夫环的问题。匹配的报告实验报告随后上传。
分别用数组和链表实现约瑟夫环,经调试正确无误
用数据结构循环队列实现约瑟夫环问题,数据结构的一次实验;
用数组实现约瑟夫环的数据结构 数组 约瑟夫环的问题
使用c语言中的循环链表及结构体实现约瑟夫环问题
这是数组表示循环链表的约瑟夫环的实验报告。与上面的源代码相匹配。
数组实现约瑟夫环 数组实现约瑟夫环 数组实现约瑟夫环 数组实现约瑟夫环 数组实现约瑟夫环
java用数组实现的约瑟夫环问题。代码简单易懂。
分别用数组和链表实现的约瑟夫环问题,内有详细的介绍。
分别用一维数组,结构体数组,循环链表实现约瑟夫环问题,功能完备,代码添加注释,经典易懂
用循环队列解决约瑟夫环问题减少用顺序表在出对是循环移动带来的空间复杂度
循环链表 实现约瑟夫环 java 自己写的 测试通过 有注释
循环队列求解约瑟夫环问题,C语言源文件供有需要的小白参考
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
约瑟夫环运作如下: 1、一群人围在一起坐成环状(如:N) 2、从某个编号开始报数(如...4、一直循环,直到所有人出列,约瑟夫环结束 例如N=6,K=1,M=5,被杀掉的顺序是:5,4,6,2,3,1。 c语言对此的解决方案
(整数,正负均可),一开始任选一个正整数作为报数上限值m,从第一个人开 ... ...则逆时针)上的下一个人开始重新从1报数,如此下去,直至所有人全部出列。...用c中的数组和链表方法可以求出出列的顺序。
通过循环链表实现约瑟夫环问题,用c语言实现。属于数据结构部分内容
根据出圈人数模拟约瑟夫环出圈情况
用c语言分别用一位数组 结构体 循环链表等方式编写约瑟夫环的代码!