Java第一次面试题(对字符串进行操作)日期:2020.5.16

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

题目要求

假定一个任意字符串N,N的长度在20-100之间(含20和100),

  • 首先对字符串进行过滤,只保留0-9,a-f, A-F之间到字符,
  • 然后 每3位切分一次,最后一段不够3位的补0,纯数字的不用做进制转换,
  • 含有字母的需要当成16进制数字 处理转换成10进制,
  • 最后按奇数和偶数分别由小到大的顺序交叉排序输出,每输出10个数字换行,
  • 如果 奇数不够补“-”,如果偶数不够补“*",需统一格式化成最长数字的长度,不够位数的前面补0,
  • 如有重复数 字,需要抛出异常,请用程序实现上述逻辑。

第一步-过滤字符串

private String s="544hua4owA326av8vneE4p56ce34bc93fkj00847fhffhj123ad349cd80ffe743f2f4f";

@Test
	public void test02() {
		StringBuilder sbu = Test02.filter(s);
		System.out.println("过滤后="+sbu);	
	}

/**
	 * 过滤字符串
	 * @param s
	 * @return
	 */
	public static StringBuilder filter(String s){
		//新建StringBuilder用来存储过滤后的字符串
		StringBuilder sbu = new StringBuilder();
		//判断长度在20-100	
		if(s.length()<20||s.length()>100){
			System.out.println("输入的字符串格式有误");
		}
		//字符串转为字节数组进行筛选,只保留0-9,a-f, A-F之间到字符,添加到sbu中	
		char[] arr = s.toCharArray();
		for (char c : arr) {	
			if (c>='0'&&c<='9') {
				sbu.append(c);
			}else if (c>='a'&&c<='f') {
				sbu.append(c);
			}else if (c>='A'&&c<='F') {
				sbu.append(c);
			}
			
		}
		return sbu;
	}

输出结果:

过滤后=544a4A326a8eE456ce34bc93f00847fff123ad349cd80ffe743f2f4f

第二步-末尾加0

private String s="544hua4owA326av8vneE4p56ce34bc93fkj00847fhffhj123ad349cd80ffe743f2f4f";

/**
	 * @author wang
	 * 测试字符串末尾加0
	 */
	@Test
	public void test03() {
		//过滤字符串
		StringBuilder sbu = Test02.filter(s);
		//按三位末尾补0
		StringBuilder s = Test02.addZero(sbu);
		System.out.println("末尾加0="+s);			
	}

/**
	 * 末尾加0
	 * @param sb1
	 * @return
	 */
	public static StringBuilder addZero(StringBuilder sb1){
		//字符串长度%3算出需要补0的个数,然后添加
		for (int i = 0; i < sb1.length()%3; i++) {
			sb1.append(0);
		}
		return sb1;
	}

输出结果:

末尾加0=544a4A326a8eE456ce34bc93f00847fff123ad349cd80ffe743f2f4f0

第三步-三位切分字符串

private String s="544hua4owA326av8vneE4p56ce34bc93fkj00847fhffhj123ad349cd80ffe743f2f4f";

/**
	 * @author wang
	 * 测试按三位切分字符串
	 */
	@Test
	public void test04() {
		//过滤字符串
		StringBuilder sbu = Test02.filter(s);
		//按三位末尾补0
		StringBuilder s = Test02.addZero(sbu);
		//按三位切分字符串
		ArrayList<String> list= Test02.cutThree(s);
		System.out.println("按3切分后="+list);		
	}

/**
	 * 按三位截取字符串
	 * @param sb2
	 * @return
	 */
	public static ArrayList<String> cutThree(StringBuilder sb2){
		//新建ArrayList存储切分后的字符串
		ArrayList<String> arrayList = new ArrayList<String>();
		int j = 0;
		int k = 0;
		//第一次截取substring(0, 3),第二次substring(3, 6)...直到超出字符串长度跳出循环
		for (int i = 0; i < sb2.length(); i++) {	
			k = k+3;
			arrayList.add(sb2.substring(j, k));
			//判断是否到达末尾处,到达跳出循环
			if (k>=sb2.length()) {	
				break;
			}
			j = j+3;		
		}
		return arrayList;
	}

输出结果:

3切分后=[544, a4A, 326, a8e, E45, 6ce, 34b, c93, f00, 847, fff, 123, ad3, 49c, d80, ffe, 743, f2f, 4f0]

第四步-转为10进制

private String s="544hua4owA326av8vneE4p56ce34bc93fkj00847fhffhj123ad349cd80ffe743f2f4f";

/**
	 * @author wang
	 * 测试转为10进制
	 */
	@Test
	public void test05() {
		//过滤字符串
		StringBuilder sbu = Test02.filter(s);
		//按三位末尾补0
		StringBuilder s = Test02.addZero(sbu);
		//按三位切分字符串
		ArrayList<String> list= Test02.cutThree(s);
		//转为10进制
		ArrayList<String> list1 = Test02.to10(list);
		System.out.println("转换10进制后="+list1);
	}

/**
	 * 转为10进制
	 * @param list
	 * @return
	 */
	public static ArrayList<String> to10(ArrayList<String> list){
		//遍历字符串集合,如果包含字母就转为10进制
		for (int i = 0; i < list.size(); i++) {
			String s11 = list.get(i);
			//判断是否包含字母
			if(s11.matches(".*[a-zA-z].*")){
				//用转成10进制的数字替换掉原来位置的元素
				list.set(i, new BigInteger(s11, 16).toString()) ;
			}	
		}
		return list;
		
	}


输出结果:

转换10进制后=[544, 2634, 326, 2702, 3653, 1742, 843, 3219, 3840, 847, 4095, 123, 2771, 1180, 3456, 4094, 743, 3887, 1264]

第五步-升序排序

private String s="544hua4owA326av8vneE4p56ce34bc93fkj00847fhffhj123ad349cd80ffe743f2f4f";

/**
	 * @author wang
	 * 测试升序排序
	 */
	@Test
	public void test06() {
		//过滤字符串
		StringBuilder sbu = Test02.filter(s);
		//按三位末尾补0
		StringBuilder s = Test02.addZero(sbu);
		//按三位切分字符串
		ArrayList<String> list= Test02.cutThree(s);
		//转为10进制
		ArrayList<String> list1 = Test02.to10(list);
		//升序排序
		ArrayList<Integer> list2 = Test02.sortList(list1);
		System.out.println("排序后="+list2);
	}
/**
	 * 升序排序
	 * @param stringlist
	 * @return
	 */
	public static ArrayList<Integer> sortList(ArrayList<String> stringlist){
		//新建ArrayList<Integer>存放数字再进行排序
		ArrayList<Integer> integerList = new ArrayList<Integer>();
		//遍历字符串集合转为Integer后存入新集合中
		for (int i = 0; i < stringlist.size(); i++) {
			Integer s = Integer.valueOf(stringlist.get(i));
			//System.out.println(Integer.valueOf(stringlist.get(i)));
			integerList.add(s);	
		}
		//利用Collections排序
		Collections.sort(integerList);
		return integerList;
			
	}

输出结果:

排序后=[123, 326, 544, 743, 843, 847, 1180, 1264, 1742, 2634, 2702, 2771, 3219, 3456, 3653, 3840, 3887, 4094, 4095]

第六步-升序排序

private String s="544hua4owA326av8vneE4p56ce34bc93fkj00847fhffhj123ad349cd80ffe743f2f4f";

/**
	 * @author wang
	 * 测试分奇偶输出
	 */
	@Test
	public void test07() {
		//过滤字符串
		StringBuilder sbu = Test02.filter(s);
		//按三位末尾补0
		StringBuilder s = Test02.addZero(sbu);
		//按三位切分字符串
		ArrayList<String> list= Test02.cutThree(s);
		//转为10进制
		ArrayList<String> list1 = Test02.to10(list);
		//升序排序
		ArrayList<Integer> list2 = Test02.sortList(list1);
		//分奇偶输出
		Test02.sortList2(list2);
	}
/**
	 * 
	 * 判断是否含有重复元素,分奇偶,单数不足补-,双数不足补*,交叉输出
	 */
	public static void sortList2(ArrayList<Integer> list){
		//判断集合中是否有重复元素,有重复元素抛出异常
		ArrayList<Integer> list3 = new ArrayList<Integer>();
		//遍历集合存入新集合,存入时判断新集合中是否已经包含此元素
		for (int i = 0; i < list.size(); i++) {		
			Integer s = list.get(i);
			if (list3.contains(s)) {
				throw new RuntimeException("集合中存在重复元素");
			}else {
				list3.add(s);
			}
			
		}
		
		//新建字符串list1集合存放奇数
		ArrayList<String> list1 = new ArrayList<String>();
		//新增字符串集合list2存放偶数
		ArrayList<String> list2 = new ArrayList<String>();
		//遍历排序好的集合,判断奇偶,再分别存入奇数集合或者偶数集合
		for (int i = 0; i < list.size(); i++) {
			int a = list.get(i);
			//如果是基数存入list1,偶数存入list2
			if (a%2==1) {
				list1.add(String.valueOf(a));
			}else {
				list2.add(String.valueOf(a));
			}	
		}
		
		//遍历奇数集合,求出奇数集合中每个元素的最大长度,存入j
		int j = 0 ;
		for (int i = 0; i < list1.size(); i++){
			int k = list1.get(i).length();
			if (j<k) {
				j=k;
			}
		}
		//根据最大长度j算出需要补0的个数( 比如最大长度4,当前字符串长度3,则需要补一个0)
		for (int i = 0; i < list1.size(); i++){
			String s = list1.get(i);
			int a = j-s.length();//算出需要补0的个数
			for (int k = 0; k < a; k++) {
				 s = "0"+s;
			}
			//补0之后的新元素再替换掉旧元素
			list1.set(i, s);	
		}
		
		//遍历偶数集合,求出偶数集合中每个元素的最大长度,存入j1
		int j1 = 0 ;
		for (int i = 0; i < list2.size(); i++){
			int k = list2.get(i).length();
			if (j1<k) {
				j1=k;
			}
		}
		//根据最大长度j1得到需要补0的个数
		for (int i = 0; i < list2.size(); i++){
			String s = list2.get(i);
			int a = j1-s.length();//算出需要补0的个数
			for (int k = 0; k < a; k++) {
				 s = "0"+s;
			}
			//补0之后的新元素再替换掉旧元素
			list2.set(i, s);	
		}
		
		
		
		/*单数补-双数补*
		 * 算出奇数集合和偶数集合的大小差值
		 * 如果差值大于0,则奇数集合大,应该为偶数集合添加*,
		 * 			根据之前算出的偶数集合中元素最大长度j1来决定一个元素需要拼接几个*,
		 * 			再根据大小差值的数值得出需要添加几个元素。
		 * 如果差值小于0,则偶数集合大,应该为奇数集合添加-,
		 * 			根据之前算出的偶数集合中元素最大长度j来决定一个元素需要拼接几个-,
		 * 			再根据大小差值的数值得出需要添加几个元素。
		 * 最后分别输出奇数集合和偶数集合
		 * 
		 * **/
		int size= list1.size()-list2.size();//算出奇数集合和偶数集合的大小差值
		//如果差值大于0,则奇数集合大,应该为偶数集合添加*,根据之前算出的偶数集合中元素最大长度j1来决定添加几个*
		if (size>0) {
			for (int i = 0; i < size; i++) {
				StringBuilder s= new StringBuilder();
				//根据之前算出的偶数集合中元素最大长度j1来决定添加几个*
				for	(int k = 0; k < j1; k++){
					s.append("*");
				}
				list2.add(s.toString());
			}
		 //如果差值小于0,则偶数集合大,应该为奇数集合添加-,根据之前算出的偶数集合中元素最大长度j来决定添加几个-
		}else if(size<0) {          
			for (int i = 0; i < Math.abs(size); i++) {
				StringBuilder s= new StringBuilder();
				for	(int k = 0; k < j; k++){
					s.append("-");				
				}
				
				list1.add(s.toString());
			}
		}
		
		System.out.println("基数集合="+list1);
		System.out.println("偶数集合="+list2);
		
			
		
		
		//把奇数集合和偶数集合作为键值对存入map
		LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
		for (int i = 0; i < list1.size(); i++) {
			map.put(list1.get(i), list2.get(i));
		}
		System.out.println("map集合="+map);
		System.out.println("最终结果:");
		Set<String> set = map.keySet();
		int a = 0;
		for (String s : set) {
			System.out.print(s);
			System.out.print(" ");
			System.out.print(map.get(s));
			System.out.print(" ");
			a+=2;
			//10个数字后换行
			if (10==a) {
				System.out.println();
			}
		}
	}

输出结果:

基数集合=[0123, 0743, 0843, 0847, 2771, 3219, 3653, 3887, 4095, ----]
偶数集合=[0326, 0544, 1180, 1264, 1742, 2634, 2702, 3456, 3840, 4094]
map集合={0123=0326, 0743=0544, 0843=1180, 0847=1264, 2771=1742, 3219=2634, 3653=2702, 3887=3456, 4095=3840, ----=4094}
最终结果:
0123 0326 0743 0544 0843 1180 0847 1264 2771 1742 
3219 2634 3653 2702 3887 3456 4095 3840 ---- 4094 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值