一个算法笔试题,求解答

一个100位的虚列数,从第1位开始读取,当读到第7位的时候,就删除第7位。当读到最后一位的时候,就跳到第1位重新开始读,按照这样,直到所有的数全部删光。

今天碰到的一个笔试题,题目的大致意思就是这样。 求各路神仙给我解答。 最好每句都能带上注释。小弟在这先行谢过了。。。

[code="java"] public static void main(String[] args) throws Exception {
List data = new ArrayList();
for(int i=1;i<=100;i++){
data.add(i);
}
int count = 0;
for(int i=0;i0;i++){
count++;
count = count%7;
if(count==0){
System.out.println("删除:"+data.get(i));
data.remove(i);
i--;
}
if(i>=data.size()-1){
i = -1;
}
}
}[/code]

删除顺序代码

FIFO的数据队列的运用!

很多面试题是都与数据结构相关的

到最后数据应该还有6条吧,不应该全部删光吧。我写了一个类似的例子,你可以依次类推。

[code="java"]import java.util.ArrayList;
import java.util.List;

/**

  • @author 碧月幽灵
    *
    */
    public class Test {

    /**

    • @param args
      */
      public static void main(String[] args) {
      List al=new ArrayList();//创建一个List
      for(int i=1;i<=100;i++){
      al.add(i);//将1到100加入到List
      }
      System.out.println(al);

      while(al.size()>6){//当List的长度大于6时执行下列循环
      for(int i=0;i<al.size();i++){
      System.out.println(al);
      al.remove(6);//删除第七个元素,长度也相应减1
      }
      }

      System.out.println(al);

    }

}[/code]

虚列数是什么意思啊,总不能像楼上那样就把第七位以后的都删了,
最后就剩下前六位,还要写什么循环啊

[code="java"]
public class Test {
//current是当前读取的位数,初始值设为-1
private static int current = -1;
//rowsPerOnce是每次读取的位数,如题要求设为7
private static int rowsPerOnce = 7;
//list为存储空间
private static List list = new ArrayList();

//可用初始化方法代替
static {
for (int i = 0; i < 100; i++) {
list.add(i);
}
}

//读取下一个值
public static Integer next() {
int size = list.size();
//判断current如果越界,则归零
current = (current + 1 >= size) ? 0 : current + 1;
return list.get(current);
}

//读取方法
public static void read() {
//读取的条数,每满一次归零
int rows = 0;
//具体读取操作
while (list.size() > 0) {
System.out.print(next() + "\t");
rows++;

//把第rowsPerOnce位删除,rows归零
if (rows % rowsPerOnce == 0) {
rows = 0;
list.remove(current);
System.out.println();
}
}
}

//主方法,调用读取方法
public static void main(String[] args) {
read();
}

}
[/code]

namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
ArrayList arlist = new ArrayList(100);
for (var i = 0; i < 100; i++)
{
arlist.Add(i);
}
foreach (var a in Meth(arlist, 7))
{
Console.WriteLine(a);
}

    }
    public static ArrayList Meth(ArrayList arr, int index)
    {
        if (arr.Count < 7) return arr;
        else
        {
            if (arr.Count == index)
            {
                arr.RemoveAt(index - 1);
            }
            else
            {
                arr.RemoveAt(index);
                Meth(arr, index);
            }
        }
        return arr;
    }
}

}

我晕,100个数,只有前面6个不会被删除的撒,所以最后剩下的只有前面6位,如果你要知道最后的数列结果的话,那就是原数列的前6位,如果你是想要知道每次是哪个数被删除,那就是顺序下来的8-100位了,还用什么for循环呀?一想就知道了

是可以全部删除的

第一轮删除 除7余0的数

第二轮删除 除7余5的数
第三轮删除 除7余3的数
第四轮删除 除7余1的数
第五轮删除 除7余6的数
第六轮删除 除7余4的数
第七轮删除 除7余2的数

全部删除完毕

指的是约瑟夫问题吗?