题目
把 abcd…s共19个字母组成的序列重复拼接106 次,得到长度为2014的串。
接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请编程求解该字母。
要求:使用循环或者递归实现,只需打印最后剩下的那个字母。
分析
首先题目中提到重复拼接和再(重复)删除,肯定需要用到多重循环(这里双重即可)。外层循环控制拼接字符串的数量,内层将字符串从a~s拼接一次。
然后再用双重循环删除字母,根据(下标+1)%2==0判断是否需要删除,终止条件:字符串长度为1(即只剩下一个字母)
循环代码
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="";//赋值为空便于后续拼接
for(int i=0;i<106;i++) {//重复拼接106次
for(char ch='a';ch<='s';ch++) {//a~s拼接一次
str+=ch;
}
}
String s;//接收删除后的字符串
while(str.length()>1) {
s="";//更新字符串s的状态 否则会与上一轮的结果拼接起来
for(int i=0;i<str.length();i++) {//遍历字符串的长度,进行一轮的删除
if((i+1)%2==0) {//如果为奇数位置
s+=str.charAt(i);//调用String中charAt(i)方法,获取i下标的元素
}
}
str=s;//str接收每一轮删除操作结束后的字符串
}
System.out.println("\n"+str);
}
递归
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="";
for(int i=0;i<106;i++) {
for(char ch='a';ch<='s';ch++) {
str+=ch;
}
}
System.out.print(fun(str));
}
public static String fun(String s) {//传入拼接好的字符串
if(s.length()==1) {//如果只剩一个字母了就终止递归,层层返回
return s;
}
String str="";//置空,否则会与上一轮的结果拼接起来
for(int i=0;i<s.length();i++) {
if((i+1)%2==0) {//下标+1
str+=s.charAt(i);//获取下标i的元素
}
}
return fun(str);//将每一轮删除的字符串传递下去 用s接收
}
结果:q