当前位置:编程学习 > JAVA >>

求助!数据结构题.

题目如下,要求用java语言编程...
以正整数n,i,k作为输入,其中n,i,k>0,且i<n。假定数1,2,…,n是环形排列的。试编写一个程序,从数i开始,按顺时针方向以k为步长打印数,当打印某个数时,应从环中删去该数,这样的过程一直进行到环空为止。例如,当n=10,i=1,k=3时,得到的输出序列是3,6,9,2,7,1,8,5,10,4。
小弟才疏学浅...
写了个如下方法 后面就不会了
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*
 *  12345678910
n=10 k=3 i=1
1st
369  剩 12457810
2nd
2(10 1后)7(4,5后)1(8,10后)

 */
public class Subject1 {
public static void main(String[] args){
Scanner inputI = new Scanner(System.in);
Scanner inputN = new Scanner(System.in);
Scanner inputK = new Scanner(System.in);

System.out.print("请输入起始数i:");
int i = inputI.nextInt();
System.out.print("请输入结尾数n:");
int n = inputN.nextInt();
System.out.print("请输入步进数k:");
int k = inputK.nextInt();
//两数组用于存储
List<Integer> list = new ArrayList();
List<Integer> list2 = new ArrayList();

//参数j,循环出i至n
for(int j = i;j <= n;i++){
list.add(j++);
}
for(int j=0;j<list.size();j++){
System.out.print(list.get(j) + " ");
}

System.out.println();//行控制

for(int j=0;j<list.size();j++){
//m 转化数组元素
int m = list.get(j);
// System.out.print(m + " ");
if(m%3==0){
list.remove(j);
list2.add(m);
}

}

// System.out.println();//行控制
//
for(int j=0;j<list.size();j++){
System.out.print(list.get(j) + " ");
}

System.out.println();//行控制

for(int j=0;j<list2.size();j++){
System.out.print(list2.get(j) + " ");
}


}
} --------------------编程问答-------------------- 挺好的,拉易做图看什么你奶奶 --------------------编程问答-------------------- 自己顶下了,哎 --------------------编程问答--------------------
package Luzhou;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*
 *  12345678910
n=10 k=3 i=1
1st
369  剩 12457810
2nd
2(10 1后)7(4,5后)1(8,10后)

 */
public class Subject1 {
public static void main(String[] args){
Scanner inputI = new Scanner(System.in);
Scanner inputN = new Scanner(System.in);
Scanner inputK = new Scanner(System.in);

// System.out.print("请输入起始数i:");
// int i = inputI.nextInt();
// System.out.print("请输入结尾数n:");
// int n = inputN.nextInt();
// System.out.print("请输入步进数k:");
// int k = inputK.nextInt();

//测试数据
int i = 1;
int n = 10;
int k = 3;

//两数组用于存储
List<Integer> list = new ArrayList();
List<Integer> list2 = new ArrayList();
List<Integer> combine = new ArrayList();
List<Integer> combine2 = new ArrayList();
List<Integer> key = new ArrayList();

//循环取出i至n的集合
for(int j = i;j <= n;i++){
list.add(j++);
}
//查看list集合
System.out.print("最初的原始数组list:"); 
for(int j=0;j<list.size();j++){
System.out.print(list.get(j) + " ");
}

System.out.println();//行控制

for(int j=1;j<list.size();j++){
//m 转化数组元素
int m = list.get(j-1);
// System.out.print(m + " ");
if(j%3==0){

key.add(j);
}

}

//查看list集合
System.out.print("新原始数组list:"); 
for(int j=0;j<list.size();j++){
System.out.print(list.get(j) + " ");
}

System.out.println();//行控制

//查看答案数据
System.out.print("答案数组key:");
for(int j=0;j<key.size();j++){
System.out.print(key.get(j) + " ");
}


System.out.println();//行控制
list2.addAll(list);
list2.removeAll(key);
//查看list2集合
System.out.print("去除key数组的list2:"); 
for(int j=0;j<list2.size();j++){
System.out.print(list2.get(j) + " ");
}
System.out.println();//行控制

combine.addAll(list);
combine.addAll(list2);
//查看合并后的combine数组
System.out.print("新的combine数组1:"); 
for(int j=0;j<combine.size();j++){
System.out.print(combine.get(j) + " ");
}
/*
 * i=1234567891011121314151617
 *  k++;
if((k*3)<combine.size()){
k++;
}
combine.remove(k*3);
combine2.addAll(combine);&&j<=combine.size()
 */
combine2.addAll(combine);
int y = 0;
for(int j=1;j<=combine2.size();j++){ //循环17次,在此循环中去掉3的倍数
if(j%3==0){

 y++;

combine.remove(j-y);//j-1 -2 -3 -4..怎么写?

}
}

System.out.println();//行控制
System.out.print(combine.get(4) + " ");
//查看合并后的combine数组
System.out.print("新的combine数组2:"); 
for(int q=0;q<combine.size();q++){
System.out.print(combine.get(q) + " ");
}

System.out.println();//行控制

combine2.removeAll(combine);

//查看合并后的combine数组
System.out.print("新的combine2数组3:"); 
for(int q=0;q<combine2.size();q++){
System.out.print(combine2.get(q) + " ");
}

key.removeAll(key);
key.addAll(combine2);
//查看答案数据
System.out.print("答案数组key:");
for(int j=0;j<key.size();j++){
System.out.print(key.get(j) + " ");
}
}
}



晚上有努力想了下 感觉看到希望了 但是还是没有解决问题 --------------------编程问答-------------------- 用链表,打印的数从链表中移除,解决问题不会超过10行代码 --------------------编程问答-------------------- 这个就是约瑟夫环吧 --------------------编程问答-------------------- 上代码

static void printRing(int n, int k, int i) {
    List<Integer> numberList = new LinkedList<Integer>();
    for (int iterN = 0; iterN < n; iterN++)
      numberList.add(iterN + 1);

    int count = i - 1;
    while (numberList.size() > 0) {
      Iterator<Integer> listIter = numberList.iterator();
      while (listIter.hasNext()) {
        count++;
        Integer number = listIter.next();
        if (count % k == 0) {
          count = 0;
          System.out.print(number + " ");
          listIter.remove();
        }
      }
    }
  }
--------------------编程问答-------------------- public class CircleCount {
private int length;
private boolean[] arr;

public CircleCount(int n){
length=n;
arr=new boolean[length];
}
//初始化数组,使数组内每个元素都为flase
public void initialize(){
for(int i=0;i<arr.length;i++){
arr[i]=false;
}
}

public void removeQueue(int k,int i){
int flag=i;
int count=0;
int accumulate=0;

while(true){
//直到所有元素出列才结束
if(accumulate==length){
break;
}

if(!arr[flag]){
count++;
}
if(count==3){
count=0;
accumulate++;
arr[flag]=true;
System.out.println(flag+1+"号出现");
}
flag=(flag+1)%length;
}
}
public static void main(String[] args) {
CircleCount c=new CircleCount(20);
c.removeQueue(3,3);
}
}
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,