A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 @追梦 于 2014-4-12 13:32 编辑

把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串。

    接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。

    得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。

评分

参与人数 1黑马币 +3 收起 理由
枫儿 + 3 赞一个!

查看全部评分

17 个回复

倒序浏览
答案是 “q”,感觉还是没想出什么好的方法。
回复 使用道具 举报
占个位,找时间花个时间研究下,思考下编程要怎么弄。
回复 使用道具 举报
本帖最后由 jingdou56 于 2014-4-10 03:38 编辑

不容易啊!
折腾出来了!

一不小心 折腾到这会儿了!

分享一下!

大家验证一下吧!

最后答案是 q !

睡觉了 ……

  1. class  TheLast
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println("***********************华丽的分割线***********************");

  6.                 StringBuilder sb = new StringBuilder();
  7.                
  8.                 char[] c = new char[20];

  9.                 c[0] = 96;
  10.                
  11.                 for(int x = 1; x<=19; x++)
  12.                 {
  13.                         c[x] = (char)( c[x-1] + 1);
  14.                         sb.append(c[x]);
  15.                         System.out.print(c[x]);
  16.                 }
  17.                 System.out.println();


  18.                 String s = "";
  19.                 for(int y = 0; y<106;y++)
  20.                 {
  21.                         s = s + sb.toString() ;
  22.                 }
  23.                 System.out.println(s.length());
  24.                 System.out.println("***********************华丽的分割线***********************");

  25.                 String buil = getTheLast(s);

  26.                 while(buil.length() != 1)
  27.                 {
  28.                         buil = getTheLast(buil);
  29.                 }
  30.                
  31.                 System.out.println("最后的字母为:" + buil);
  32.         }

  33.         public static String getTheLast(String s)
  34.         {
  35.                 int flag;
  36.                 if(s.length() % 2 == 0)
  37.                         flag = 0;
  38.                 else
  39.                         flag =1;
  40.                 StringBuilder sb2 = new StringBuilder();

  41.                 while(s.length() != flag )
  42.                 {
  43.                         sb2.append(s.charAt(1));
  44.                         s = s.substring(2);

  45.                 }
  46.                
  47.                 return sb2.toString();
  48.         }
  49. }
复制代码







评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报 1 0
下面是我刚刚完成的,结果跟上面大神一样,也是q。

public class LanQiao
{
        public static void main(String[] args)
        {
                String str = "abcdefghijklmnopqrs";
                StringBuffer strbu = new StringBuffer();
                //StringBuffer strb = new StringBuffer("abcdefghij");
                //将字符串拼接106次
                for (int i = 0; i < 106; i++)
                {
                        strbu = strbu.append(str);
                }
               
                //按照题目的意思,删除字符串所有奇数位置的字母
                while (1 != strbu.length())  //最后剩下一个字母,故循环结束条件为最后的长度为1
                {
                        for (int i = 0; i < strbu.length(); i++)
                        {
                                //如果将字符串看成一个字符数组,那么按照题目的意思,就是删除数组中
                                //所有下标为偶数(包括0)的字母
                                strbu.deleteCharAt(i);  //删除索引i处的字母
                                //System.out.println(strb);
                        }
                }
                System.out.println(strbu);   //最后结果是q
        }
}


我用一个较短的字符串试了试,代码如下:
StringBuffer strb = new StringBuffer("abcdefghij");
while (1 != strb.length())  //最后剩下一个字母,故循环结束条件为最后的长度为1
{
        for (int i = 0; i < strb.length(); i++)
        {
                strb.deleteCharAt(i);  //删除索引i处的字母
                System.out.println(strb);
        }

}
编译运行后结果如下:

不知道大家注意到了没有,当你删除当前i处的字母时,后边的字母会向前移动一个字符,这样,当前已被删的字母的下一个字母其实已经移到i处了,但此时i已经自增了1。比如删除第一个字母a后,结果是bcdefghij,下一个要删除的是字母c。在for循环里,a被删除后,原来的strb变成了bcdefghij,而此时i自增1后的结果由0变为1,刚好是字母c的位置。由此可见,当删除一个字母后,后面的所有字母都会向前移动一位,然后i自增1,那么此时i所表示的位置刚好是下一次将要删除的字母。


有一个问题我没有弄明白。
在删除第一个字母a后,再次进行条件判断的时候, i < strb.length(),这里str.length()的结果是10呢,还是9。我试了一下,结果如下:


我奇怪的是,循环的时候,strb的长度一直在改变,为什么这里没有报异常:java.util.ConcurrentModificationException。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 曲佳奇 于 2014-4-10 11:41 编辑
  1. public class Test {
  2.     public static void main(String[] args) {
  3.         int[] a = new int[3000];
  4.         int tem,k,sum,p;
  5.         System.out.println("**输入字符串长度**");        
  6.         Scanner cin = new Scanner(System.in);
  7.         int num = cin.nextInt();
  8.         for(int i=1;i<num;i++)
  9.             a[i]=i;
  10.         k=0;  //标记不为0的数个数 当k=1时结束
  11.         tem=1;//每次间隔tem个数归零
  12.         sum=0;//记录结果
  13.         while(k!=1){
  14.             p=1;k=0;
  15.             for(int i=tem;i<num;i+=tem){
  16.                 if(p==0){
  17.                     p=1;
  18.                     continue;
  19.                 }else
  20.                     p=0;
  21.                 a[i]=0;
  22.             }
  23.             for(int i=1;i<num;i++){
  24.                 if(a[i]!=0){
  25.                     sum=a[i];
  26.                     k++;
  27.                 }
  28.             }
  29.             tem*=2;
  30.         }
  31.         sum = 'a' + sum % 19-1;
  32.         char c = (char) sum;
  33.         System.out.println(c);
  34.     }
  35. }
复制代码
由题目可知,每次执行删除操作后,第一个数都是2^n
在"2^n<给出数字<=2^n+1"这个范围内的数字删到最后时结果都为2^n
所以1024<2014<=2048
最后剩下的就是字符串的第1024位

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
创造命运 发表于 2014-4-10 08:17
下面是我刚刚完成的,结果跟上面大神一样,也是q。

public class LanQiao

我说呢,删除下标为偶数的字母怎么不是  strbu.deleteCharAt(2i);而是strbu.deleteCharAt(i);,原来是它的长度一直在变化。。是不是因为StringBuffer是可变长度的字符串,所以才不会出现异常呢
回复 使用道具 举报
小歪 中级黑马 2014-4-10 22:17:56
8#


public class Test03 {
        public static void main(String args[])
        {
                int a[]=new int[2015];
                for(int j=1;j<=2014;j++)
                {
                        a[j]=j;
                }
                int i = 0;
                int num=2014;
                while (num/2!=0)
                {
                        for(i=1;i<num;i++)
                        {
                                if(i%2==0) a[i/2]=a[i];
                        }
                        num=num/2;
                }
                System.out.println(a[i/2]);
                System.out.println(a[i/2]%19);
               
        }

}
答案:Q  
看了下他们的算法都太复杂了没必要,此题只是考了个简单算法,楼主看看会有所感悟的,我是以123456...来代替abcde...   最后结果是17,也就是Q,很简单的算法。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
小歪 中级黑马 2014-4-10 22:25:05
9#
@追梦 发表于 2014-4-9 21:08
答案是 “q”,感觉还是没想出什么好的方法。

楼主看我的方法,会有所领悟。:loveliness:  晚安
回复 使用道具 举报
小歪 发表于 2014-4-10 22:25
楼主看我的方法,会有所领悟。  晚安

多谢,有所领悟,你的方法比较巧妙,我感觉是不是把最后两句改成System.out.println(a[1]);  System.out.println(a[1]%19);更容易理解些,你的程序相当于每次删除后把元素前移一半,直到最后一次,应该是a[1]存的既是要求的元素,你为什写的是a[i/2]呢,运行后 i 的结果为3,这点不太明白。。其实前面他们的算法只不过用的是可变长度字符串的一些方法,也不算复杂,哥们可以试着看看,方法也不错
回复 使用道具 举报
@追梦 发表于 2014-4-10 23:40
多谢,有所领悟,你的方法比较巧妙,我感觉是不是把最后两句改成System.out.println(a[1]);  System.out. ...

之所以a[i/2]是计算去掉奇数位后这些偶数位的新的坐标,其实楼主画个图假如只有10个字母自己亲自去奇数位操作一下,看看他们的下标变化就会更好理解的哦。
回复 使用道具 举报
其实此题的思想就是:去掉奇数位,留下偶数位
比如说一组数:
        1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17
去除第一次余下的数为:
           2     4     6     8     10      12      14      16  都为2(也就是2^1)的倍数
去除第一次余下的数为:
                 4             8             12              16  都为4(也就是2^2)的倍数
去除第一次余下的数为:
                             8                             16  都为8(也就是2^3)的倍数
        ...............
也就是说去除n次后  最后剩下的一个数就是2的n的次数  那么去除多少次呢
剩下的最后一个数是要小于2014的 并且是2的次方的最大的数
2^n<2014<2^(n+1)  这个n就是我们需要的n

此题为例  n=10  也就是说 最后剩下的数 就是第2^10个数

(2^10)%19=17  也就是 Q         代码如下   
               
                        for(n = 0;Math.pow(2,n)< 2014;n++){                               
                        }
                        return n - 1;
                        得到n = 10

                        int m= Math.pow(2,n)%19
                        得到m = 17  也就是Q了
回复 使用道具 举报
本帖最后由 袁啟雄x 于 2014-4-11 16:15 编辑

我得答案也是Q - - 代码有点凌乱
  1. public class Demo {

  2.         public static void main(String[] args) {
  3.                 int size = 2014;
  4.                 char[] arr = new char[size];
  5.                 createArray(arr);
  6.                 swap(arr, size);
  7.         }
  8.         
  9.         public static void createArray(char[] arr){
  10.                 char c = 97;
  11.                 for (int i = 0; i < 2014; i++) {
  12.                         arr[i] = c++;
  13.                         if(c>115) c = 97;
  14.                         
  15.                 }
  16.         }
  17.         
  18.         public static void swap(char[] arr , int size){
  19.                 if(size==1){
  20.                         System.out.println(arr[0]);
  21.                         return;
  22.                 }
  23.                 int newSize = size;
  24.                 for (int i = 0; i < size; i+=2) {
  25.                         arr[i] = '\n' ;
  26.                         newSize--;
  27.                 }
  28.                 arr = swapArr(arr);
  29.                 swap(arr, newSize);
  30.         }
  31.         
  32.         public static char[] swapArr(char[] arr){
  33.                 char[] swapArr = new char[arr.length] ;
  34.                 int pos = 0 ;
  35.                 for (int i = 0; i < arr.length; i++) {
  36.                         if(arr[i]!='\n') swapArr[pos++] = arr[i];
  37.                 }
  38.                 return swapArr;
  39.         }

  40. }
复制代码
回复 使用道具 举报
本帖最后由 Kelvinhu 于 2014-4-11 16:54 编辑

可以将问题简单化,把2014个字母放到数组中,其下标值最大2014-1(因为第一数组下标为0嘛)

数组的下标值是0   1   2   3  4  5  6  7  8  9  10  11  12.。。。。。。。。。。
第一次去除后就是  1       3       5     7      9        11       .。。。。。。。。。。
依次类推,这个规律就是 (2的n次方-1)  下标值 的数组就是最后一个的值的数组下标。
那么n是多少呢?可以用代码来算一下。
这个问题就简化成一个数组下标计算的问题。代码如下所示:
  1. class SimpleMath{
  2.        
  3.         public static void main(String args[]){
  4.                 System.out.print(getSquare());
  5.                 //由简单的规律可以得出 中间剩下的值就是2的(n-1)次方,那么它就是1024,这样取出第1024个数组的值即可。也就是下标数组[1024-1]的值
  6.         }
  7.        
  8.         static double getSquare(){
  9.                 //计算2014是2的多少次方?
  10.                 for(int i=0;;i++) {  
  11.                         if (2014==Math.pow(2,i)){
  12.                                 return i;
  13.                         }
  14.                 }
  15.         }
  16. }
复制代码


回复 使用道具 举报
  1. class  StrDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String orgStr = "abcdefghijklmnopqrs";
  6.                 StringBuilder sb = new StringBuilder();
  7.                 for(int i=0; i<106; i++)
  8.                 {
  9.                         sb.append(orgStr);
  10.                 }
  11.                
  12.                 while(sb.length() != 1)
  13.                 {
  14.                         for(int i=0; i<sb.length(); i++) //难点在这个i++ 想通了一切都会明白
  15.                         {
  16.                                 sb.deleteCharAt(i);
  17.                         }
  18.                 }

  19.                 System.out.println(sb.toString());
  20.         }
  21. }
复制代码


输出结果是 q
回复 使用道具 举报
  1. public class demo {
  2.         static String str = "";
  3.         static StringBuffer sb;
  4.         static char c = 96;

  5.         public static void main(String[] args) {
  6.                 sb = new StringBuffer();
  7.                 creatString();
  8.                 deleteChar();
  9.                 System.out.println("result: " + str);
  10.         }

  11.         public static void creatString() {
  12.                 for (int i = 0; i < 106; i++) {
  13.                         for (int j = 0; j < 19; j++) {
  14.                                 c = (char) (c + 1);
  15.                                 sb.append(c);
  16.                         }
  17.                         c = 96;
  18.                 }
  19.         }

  20.         public static void deleteChar() {
  21.                 while (sb.length() > 1) {
  22.                         int i = 0;
  23.                         while (i < sb.length()) {
  24.                                 sb.deleteCharAt(i);
  25.                                 i++;
  26.                         }
  27.                 }
  28.                 str = sb.toString();
  29.         }
  30. }
复制代码
回复 使用道具 举报
jingdou56 发表于 2014-4-10 02:13
不容易啊!
折腾出来了!

真不是人干的事,刚刚忙了30多分钟终于弄完了
  1. package it.cast;

  2. /*
  3. * 把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
  4. * 接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
  5. *得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
  6. * */
  7. public class MyTheLast {
  8.         public static void main(String[] args) {
  9.                 String str = "abcdefghijklmnopqrs";
  10.                 StringBuffer sb = new StringBuffer();
  11.                 for(int x =0 ; x<106; x++)
  12.                 {
  13.                         sb.append("abcdefghijklmnopqrs");
  14.                 }
  15.                 System.out.println(sb.length());

  16.                 System.out.println("最后一个字母为:"+delete(sb));
  17.                
  18.                
  19.         }
  20.        
  21.         static StringBuffer delete(StringBuffer sb)
  22.         {
  23.                 StringBuffer sb1 = null;
  24.                
  25.                 do
  26.                 {
  27.                         sb1 = null;
  28.                     sb1 = new StringBuffer();
  29.                         for(int x = 0; x<sb.length()-1;x++)
  30.                         {
  31.                                 sb1.append(sb.charAt(x+1));
  32.                                 x++;       
  33.                         }
  34.                         String str2 = new String(sb1);
  35.                
  36.                         sb.replace(0, sb.length(), str2);
  37.                 }while( sb1.length()!=1 );
  38.                
  39.                 return sb1;
  40.                
  41.                
  42.         }

  43. }
复制代码
回复 使用道具 举报
用C做的{:8_472:}

#include <stdio.h>
#include <math.h>
void fun(char *ary,int i)
{
        int a,b,c;
        int z=1;
        if (i==1)
        {  printf("%c\n",ary[1]);
        }
        else            //记住是从零开始的。
           {
                   for(a=0;a<(i+1)/2;a++)
                   {
                           ary[a]=ary[z];
                           z+=2;
                   }
                   fun(ary,(i+1)/2);
           }
}
int main()         //应该是用递归。
{
   char ary[2014];
   int i,j,k=0;
   for(i=0;i<106;i++)
           for(j=97;j<116;j++)
       {
                   ary[k]=j; k++;
           }
   fun(ary,2013);
   return 0;
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马