猜字母c语言蓝桥杯,蓝桥杯——猜字母

问题描述:字母序列a,b,c,...,p,q,r,s共19个字母,现重复该字串106次,形成一个有2014字符的字串,将奇数位的字符删除,重复此操            作,直至剩下最后一个字母,问剩下的字母是什么?答案必须是小写字母。

方法解答:此题目既可以用数学方法解答,也可编程实现。数学方法:

首先来看,数字1,2,3,...,8,9,10,经第一次删除后剩下的为2,4,6,8,10,再删除一次剩下的为4,8,最后删除剩下的为8;我们可以发现,经过一轮删除后,2变成了第1位,4变成了第2位,6变成了第3位,8变成了第4位,10变成了第5位;再经一轮后,4变成了第1位,8变成了第2位;最后一轮后,8变成了第1位。每删除一轮,原来位置上的数相当于到了除以2所得商的位置上的数,那么,如此下来,最后剩下的那个数一定是除以2后商一直为偶数的那个数,即一直在偶数位的那个数。实际上,2014个字母重复删除奇数位,最后剩下的那个字母便是开始时在1024位上的字母。因为1024=2^10,这意味着它要除以2除10次才等于1,而在1024之前的数,不到10次就已经变成了奇数,意味着被删除了,而在1024之后的数都等于2^10+k(常数),而k肯定比1024小,重复除2操作后,k先到达了奇数,于是这个数就被相应的删除了。如此,重复删除奇数位操作,最后剩下的那个字母便是1024%19=17,第17位的字母为q,也即是最后剩下的字母为q。编程实现:

方法一:字符串操作

每次删除操作后剩下的字母都是偶数位上的字母,可以利用两个字符串反复取偶数位的字符,直到剩下一个字符为止,参考代码如下:public class Test {

public static void main(String[] args) {

String str = "abcdefghijklmnopqrs";

String str_ = "";

int i = 0;

while (i 

str_ += str;

i++;

}

str = "";

while(str_.length()>1) {

for(i=1;i

str += str_.charAt(i);

}

str_ = str;

str = "";

}

System.out.println(str_);

}

}

方法二:单项循环链表

参考代码如下:

public class LetterGuess {

public static void main(String[] args) {

Node flag = new Node(0);

int i = 1;

Node tmp = flag;

while (i <= 2014) {

tmp.next = new Node(i);

tmp = tmp.next;

i++;

}

tmp.next = flag;

tmp = flag;

for (i = 1; i 

if (tmp.next != flag) {

tmp.next = tmp.next.next;

tmp = tmp.next;

i++;

} else {

tmp = flag;

}

}

System.out.println((char) (flag.next.data % 19 + 97 - 1));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值