蓝桥杯 2014-3 猜字母

把abcd…s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
答案是一个小写字母,请通过浏览器提交答案。不要填写任何多余的内容。

一开始我用字符串写,发现我无法改变字符串中的某个位置的字符,但是可以用“”来替换某个字符实现删除某个字符。后来我用想用字符数组,但是字符数组不能实现简单的删除,删除很麻烦。最终用了List。

还有一个比较重点的一个问题,因为我在删除List中的某个数时,他们的位置都不在是原来的位置,如果我还是继续删除3,5,7等位置明显不对,所以当删除一个字母时,后面的位置都会相应减1,所以我要i–,在for循环中是i += 2.

for (int i = 0; i < temp.size(); i += 2) {
				temp.remove(i);
				i--;
			}

后来也尝试过一个方法,就是我每次不删要删的字符而是记录下来,然后循环完一遍后,再一下子全删了,逻辑似乎不错,可是List中有很多重复的,比如说我要删,a,b,实际只删一个,但是他会全部删了。

import java.util.ArrayList;
import java.util.List;

public class okt3猜字母 {
	public static void main(String[] args) {
		f1();
		// f2();
		// f3();

	}

	private static void f3() {
		// TODO Auto-generated method stub
		String s = "abcdefghijklmnopqrs";
		char[] ss = s.toCharArray();
		List<Character> ll = new ArrayList<Character>();
		for (int i = 0; i < 106; i++) {
			for (int j = 0; j < ss.length; j++) {
				ll.add(ss[j]);
			}
		}
		while (ll.size() != 1) {
			int length = ll.size();
			List<Character> temp = new ArrayList<Character>();
			temp = ll;
			for (int i = 0; i < temp.size(); i += 2) {
				temp.remove(i);
				i--;
			}
			ll = temp;
		}
		System.out.println(ll.get(0));
	}

	public static void f1() {
		char[] a = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's' };
		ArrayList<Character> arrayList = new ArrayList<Character>();
		for (int i = 0; i < 106; i++) {
			for (int j = 0; j < 19; j++) {
				arrayList.add(a[j]);
			}
		}
		// System.out.println(arrayList.size());
		while (arrayList.size() > 1) {
			// ArrayList<Character> temp = new ArrayList<Character>();
			int jj = 0;
			int len = arrayList.size();
			for (int i = 0; i < len; i += 2) {
				// temp.add(arrayList.get(i));
				// System.out.println(arrayList.get(i - jj) + "........");
				arrayList.remove(i - jj);
				jj++;
			}
//			arrayList.removeAll(temp);
//			System.out.println(arrayList.size());
		}
		// System.out.println(arrayList.size());
		System.out.println(arrayList.get(0));
	}

	public static void f2() {
		char[] a = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's' };
		ArrayList<Character> arrayList = new ArrayList<Character>();
		// for (int i = 0; i < 106; i++) {
		for (int j = 0; j < 19; j++) {
			arrayList.add(a[j]);
		}
		// }
		// System.out.println(arrayList.size());
		while (arrayList.size() > 1) {
			ArrayList<Character> temp = new ArrayList<Character>();
			int jj = 0;
			int len = arrayList.size();
			for (int i = 0; i < len; i += 2) {
				temp.add(arrayList.get(i));
			}
			arrayList.removeAll(temp);// 移除arraylist中所有与temp相等的元素,而arraylist中本身就有很多重复元素,所以会出错
			System.out.println(arrayList.size());
		}
		System.out.println(arrayList.size());
		System.out.println(arrayList.get(0));

	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值