`

数组循环右移和约瑟夫环问题

J# 
阅读更多

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());
	}
}

 

0
0
分享到:
评论
1 楼 form_rr 2009-10-28  
对第一个问题的测试结果:
在n=500000的时候
Move方法和Move2方法速度相当
在n<500000的时候
Move方法比Move2方法慢45%左右
在n>500000的时候
Move方法比Move2方法快,并且随着n越大,越快!


相关推荐

    约瑟夫问题的源代码实现

    对于编程实现约瑟夫问题,可以采用不同的数据结构,如链表、数组或者循环双链表等。这里主要介绍两种常见的方法:链表法和位运算法。 1. 链表法: 使用链表来模拟士兵的排列,每个节点代表一个士兵,节点的next...

    数据结构习题

    - 在原数组中实现循环右移,不额外申请空间。 - 时间性能尽可能好。 - 分析算法的时间复杂度。 **设计思想**:通过三次反转操作实现数组的循环移位,具体步骤如下: 1. 将数组的前i个元素逆置。 2. 将数组的后n-i个...

    C、C++编程(二)

    第二段代码展示了约瑟夫环问题的经典解法,这是一个常见的数据结构和算法问题。在这个问题中,有n个人围成一个圈,从某个人开始报数,报到m的人将被移除出圈,过程循环直到所有人都被移除。代码中使用了一个数组来...

    java50道经典练习题.docx

    ### Java经典练习题知识点解析 #### 知识点1:斐波那契数列与兔子繁殖问题 **题目概述:** 假设有一对兔子,从出生后第3个月起每个月都会生一对新兔子,而这些新生的兔子...- **算法设计**:约瑟夫环问题的算法设计。

    C语言编程题

    字符串字符循环右移 这部分代码实现了一个简单的字符串操作,即将字符串中每个字符的ASCII值与下一个字符的ASCII值进行循环交换,从而改变字符串的顺序。通过临时变量存储首字符的ASCII值,遍历字符串并更新每个...

    关于程序语言的一份试题

    - 使用链表或数组模拟约瑟夫环问题。 - 算法的优化与复杂度分析。 #### 题目十八:逻辑推理 - **知识点**: - 逻辑推理的基本原则:真值表、逻辑运算符等。 - 如何通过逻辑推导解决实际问题。 - 推理过程的...

    三级网络上机试题汇总

    - **约瑟夫环问题:** 使用循环链表或者数组模拟出圈过程。 ### 13. 进制转换 这部分题目要求将一个数从一种进制转换为另一种进制,如从十进制转换为二进制等。 **关键知识点:** - **进制转换:** 使用除基取余法...

    传智播客扫地僧视频讲义源码

    02_模板数组类_作业讲解和思想强化(数据类型和算法的分离)_传智扫地僧 03_类型转换_static_cast和reinterpret_cast 04_类型转换_dynamic_cast和reinterpret_cast_传智扫地僧 05_类型转换_const_cast 06_异常的基本...

    JAVA练习题(50题)

    - **实现思路**:根据给定的公式,使用循环结构计算序列的和。 #### 练习题10:字符串拼接 - **知识点**: - 字符串的拼接操作。 - 循环结构的应用。 - 输出格式的控制。 - **实现思路**:利用循环结构将多个...

Global site tag (gtag.js) - Google Analytics