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());
}
}
分享到:
相关推荐
对于编程实现约瑟夫问题,可以采用不同的数据结构,如链表、数组或者循环双链表等。这里主要介绍两种常见的方法:链表法和位运算法。 1. 链表法: 使用链表来模拟士兵的排列,每个节点代表一个士兵,节点的next...
- 在原数组中实现循环右移,不额外申请空间。 - 时间性能尽可能好。 - 分析算法的时间复杂度。 **设计思想**:通过三次反转操作实现数组的循环移位,具体步骤如下: 1. 将数组的前i个元素逆置。 2. 将数组的后n-i个...
第二段代码展示了约瑟夫环问题的经典解法,这是一个常见的数据结构和算法问题。在这个问题中,有n个人围成一个圈,从某个人开始报数,报到m的人将被移除出圈,过程循环直到所有人都被移除。代码中使用了一个数组来...
### Java经典练习题知识点解析 #### 知识点1:斐波那契数列与兔子繁殖问题 **题目概述:** 假设有一对兔子,从出生后第3个月起每个月都会生一对新兔子,而这些新生的兔子...- **算法设计**:约瑟夫环问题的算法设计。
字符串字符循环右移 这部分代码实现了一个简单的字符串操作,即将字符串中每个字符的ASCII值与下一个字符的ASCII值进行循环交换,从而改变字符串的顺序。通过临时变量存储首字符的ASCII值,遍历字符串并更新每个...
- 使用链表或数组模拟约瑟夫环问题。 - 算法的优化与复杂度分析。 #### 题目十八:逻辑推理 - **知识点**: - 逻辑推理的基本原则:真值表、逻辑运算符等。 - 如何通过逻辑推导解决实际问题。 - 推理过程的...
- **约瑟夫环问题:** 使用循环链表或者数组模拟出圈过程。 ### 13. 进制转换 这部分题目要求将一个数从一种进制转换为另一种进制,如从十进制转换为二进制等。 **关键知识点:** - **进制转换:** 使用除基取余法...
02_模板数组类_作业讲解和思想强化(数据类型和算法的分离)_传智扫地僧 03_类型转换_static_cast和reinterpret_cast 04_类型转换_dynamic_cast和reinterpret_cast_传智扫地僧 05_类型转换_const_cast 06_异常的基本...
- **实现思路**:根据给定的公式,使用循环结构计算序列的和。 #### 练习题10:字符串拼接 - **知识点**: - 字符串的拼接操作。 - 循环结构的应用。 - 输出格式的控制。 - **实现思路**:利用循环结构将多个...