//标题:猜字母
//把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
//接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
//得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
//答案是一个小写字母,请通过浏览器提交答案。不要填写任何多余的内容。
public class Main{
    public static void main(String[] args) {
        String s = "abcdefghijklmnopqrs";
        String str = "";
        for (int i = 0; i < 106; i++) {
            str += s;
        }
        //System.out.println(str.length());
        boolean[] flag = new boolean[str.length()];
        for (int i = 0; i < flag.length; i++) {
            flag[i] = true;        //未被删除的字母标记为true
        }
        
        int oldIndex = 0;  //旧串的下标
        int newIndex = 0;  //新串的下标
        int leftCount = str.length();  //剩余的字母数
        
        while(leftCount > 1){             //最后只剩下一个字母
            
            if (flag[oldIndex] == true) {  //如果该字母未被删除
                if (newIndex % 2 == 0) {  //看此时(新串)的下标是否需要被删除
                    flag[oldIndex] = false;   //删除该字母
                    leftCount--;         //剩余字母数-1
                }
                newIndex++;           //未被删除的字母构成新串
            }
            oldIndex++;              //旧串的遍历
            
            //得到的新串再进行删除奇数位置字母的动作,所以下标都重新置为0
            if (oldIndex == str.length()) {  
                newIndex = 0;
                oldIndex = 0;
            }
        }
        
        for (int i = 0; i < flag.length; i++) {
            if (flag[i] == true) {
                System.out.println(str.charAt(i));
                break;
            }
        }
    }
}

 

相关文章: