一道公务员的考试题目.用编程实现.出现了一些奇怪的问题.请高手多多指教

winner8009 2005-07-21 01:17:29
package com.thread;

import java.io.IOException;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
/*
* 奇怪的程序去掉map中的奇数位置的对象
* 100张多米诺骨牌整齐地排成一列,依顺序编号为1,2,3,......99,100.第一次拿走
* 所有奇数位置上地骨牌,第二次再从剩余的骨牌中拿走所有奇数位置上的骨牌,依此类推.
* 请问最后剩下的一张骨牌的编号是多少??
* 用array容易实现但是用list,set,map就不行
*/
public class Test {

/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Map map = new TreeMap();
//发牌
for(int i = 0; i <= 20; i++) {
map.put(new Integer(i),new Counter(i));
}
//抽牌
map = drawOut(map);
//打印结果
System.out.println("The last is :" + map);
}

//抽取奇数位置的牌
public static Map drawOut(Map map) throws IOException {
//抽牌以前的骨牌
System.out.println("抽牌以前的骨牌: " + map);
//抽牌
for(int i = 1 ; i < map.size(); i++) {
// System.out.print("outside: " + i + " ");
// System.out.println(((i+1)%2)==0);
// 不管map有多大,为什么总是判断到一半以后就跳出循环?我用list,set,hashmap都是这样的.
// 为什么会这样啊,那位大侠可以说一说,万分感谢!
// 但是如果把if语句注解调就是正确的
if(((i+1)%2)==0) {
// System.out.print("inside: " +i + " ");
// System.out.println(((i+1)%2)==0);
map.remove(new Integer(i));
}
}
//抽牌以后的骨牌
System.out.println("抽牌以后的骨牌: " + map);
Map mapTemp = new TreeMap();
int i = 0;
for(Iterator it=map.keySet().iterator();it.hasNext();) {
mapTemp.put(new Integer(i),map.get((Integer)it.next()));
i++;
}
map = null; //洗掉旧牌
//重新整理后的骨牌
System.out.println("重新整理后的骨牌: " + mapTemp);
//递归调用直到剩最后一张牌,由于第一张放的是begin所以size>2
if(mapTemp.size()>2) {
//看看还剩几张牌
System.out.println(mapTemp.size());
System.out.println("Press any key continue");
System.in.read();
drawOut(mapTemp);
}
//打印抽出的结果,希望有大侠多多指点.打印的结果为什么会是这个样子?
System.out.println("我晕:" + mapTemp);
return mapTemp;
}
}
//一个简单的包装类
class Counter implements Comparable{
private int i;
Counter(int i){
this.i = i;
}
public int getCounter() {
return i;
}
public String toString() {
return i==0?"begin: ":Integer.toString(i);
}
public int compareTo(Object o) {
int j = ((Counter)o).getCounter();
return (i < j ? -1: (i == j ? 0 : 1));
}
}
...全文
158 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
庄鱼 2005-07-21
  • 打赏
  • 举报
回复
public class Test {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Map map = new TreeMap();
//发牌
//---------------------------- (1)
for(int i = 0; i <= 20; i++) { //--- i=0?
map.put(new Integer(i),new Counter(i)); // Integer(i+1)...
}
//抽牌
map = drawOut(map);
//打印结果
System.out.println("The last is :" + map);
}

//抽取奇数位置的牌
public static Map drawOut(Map map) throws IOException {
//抽牌以前的骨牌
System.out.println("抽牌以前的骨牌: " + map);
//抽牌
//-------------------------------(2)
for(int i = 1 ; i < map.size(); i++) { //--- i=1? => i=0;
// System.out.print("outside: " + i + " ");
// System.out.println(((i+1)%2)==0);
// 不管map有多大,为什么总是判断到一半以后就跳出循环?我用list,set,hashmap都是这样的.
// 为什么会这样啊,那位大侠可以说一说,万分感谢!
// 但是如果把if语句注解调就是正确的
//-------------------------- (3)
if(((i+1)%2)==0) { //----- if(i%2==0)
// System.out.print("inside: " +i + " "); //-- i+1
// System.out.println(((i+1)%2)==0);
map.remove(new Integer(i));
}
}
//抽牌以后的骨牌
System.out.println("抽牌以后的骨牌: " + map);
Map mapTemp = new TreeMap();
int i = 0;
for(Iterator it=map.keySet().iterator();it.hasNext();) {
mapTemp.put(new Integer(i),map.get((Integer)it.next()));
i++;
}
map = null; //洗掉旧牌
//重新整理后的骨牌
System.out.println("重新整理后的骨牌: " + mapTemp);
//递归调用直到剩最后一张牌,由于第一张放的是begin所以size>2
if(mapTemp.size()>2) {
//看看还剩几张牌
System.out.println(mapTemp.size());
System.out.println("Press any key continue");
System.in.read();
drawOut(mapTemp);
}
//打印抽出的结果,希望有大侠多多指点.打印的结果为什么会是这个样子?
System.out.println("我晕:" + mapTemp);
return mapTemp;
}
}
//一个简单的包装类
class Counter implements Comparable{
private int i;
Counter(int i){
this.i = i;
}
public int getCounter() {
return i;
}
public String toString() {
return i==0?"begin: ":Integer.toString(i);
}
public int compareTo(Object o) {
int j = ((Counter)o).getCounter();
return (i < j ? -1: (i == j ? 0 : 1));
}
}
winner8009 2005-07-21
  • 打赏
  • 举报
回复
我用数组写的算法.没有问题
package com.thread;

import java.io.IOException;

public class Pai {
static int[] a = new int[101];
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//发牌
for(int i = 1; i <a.length; i++) {
a[i]=i;
}
//抽牌
drawOut(a);
}

public static void prt(int[] a) {
for(int i = 1; i <a.length; i++) {
System.out.print(a[i] == 0 ? "" : " " + a[i]);
if(i%20==0) System.out.println("");
}
System.out.println("");
}
//抽取奇数位置的牌
public static void drawOut(int[] a) throws IOException {
//抽牌以前的骨牌
System.out.print("抽牌以前的骨牌: ");
prt(a);
//抽牌
for(int i = 0 ; i < a.length; i++) {
if(((i+1)%2)==0) {
a[i] = 0;
}
}
//抽牌以后的骨牌
System.out.print("抽牌以后的骨牌: ");
prt(a);
//重新整理后的骨牌
int j = 1;
for(int i = 1 ; i < a.length; i++) {
if(a[i] !=0 ) {
a[j] = a[i];
a[i] = 0;
j++;
}
}
System.out.print("重新整理后的骨牌: ");
prt(a);
//递归调用直到剩最后一张牌,由于第一张放的是begin所以size>2
if(j>2) {
System.out.println("Press any key continue");
System.in.read();
drawOut(a);
}
System.out.print("The Last is: ");
prt(a);
}
}
winner8009 2005-07-21
  • 打赏
  • 举报
回复
直接可以到机器上面调试的,看打印结果.我都要疯了.大家看看,蛮锻炼编程能力的.希望有高手不吝赐教!!

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧