JAVA基础编程50题(25-27题)详解

一、描述

题目1:判断一个数字是否是2的阶次方数,例如8,16,64,256都是2的阶次方数。
          题目解析:如果一个数是2的阶次方数,那么这个数字的二进制数的首位为1,后面跟着若干个0,例如8用二进制表示为1000,64为1000000, 如果让这个数减1,然后和这个数做按位&运算即得0,即(number-1)&number==0,8&7=1000&0111=0000。

题目2:列出一个数组中所有元素的组合,比如1、2、3列出来为1、12、123、13、132、2、21、213、23、231、3、31、312、32、321,采用递归的方法

题目3:求出一个字符串中出现次数最多的那个字母及其出现的次数,如果有多个字符出现的次数相同,也列出这多个字符。
题目解析:将字符串转换为char数组,然后将每个字符放在TreeSet和ArrayList中, 因为TreeSet本身就有排序功能,添加进去char默认排好序的,而且这个集合是不能有重复元素的,所以相同的字符只能存储一次,而ArrayList中可以存储重复的char。 我们利用Collections.sort()函数将ArrayList中的字符进行排序,那么相同的字符就一定是相邻的。 然后循环遍历TreeSet集合中的元素,查找该元素在ArrayList中第一次和最后一次出现的位置,该字符出现的次数=最后一次出现的次数-第一次出现的次数+1


二、源代码

程序1:

<span style="font-size:18px;">package tong.yue.socket;

import java.util.Scanner;

public class isPower {

	/**
	 * 判断一个数字是否是2的阶次方数,例如8,16,64,256都是2的阶次方数
	 * 解析:如果一个数是2的阶次方数,那么这个数字的二进制数的首位为1,后面跟着若干个0,例如8用二进制表示为1000,64为1000000,
	 * 如果让这个数减1,然后和这个数做按位&运算即得0,即(number-1)&number==0
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner scanner  = new Scanner(System.in);
		System.out.println("Please input a number between 1-50000:");
		int number = scanner.nextInt();
		while(true){
			if (number<=0||number>50000) {
				System.out.println("Number error,please input a number between 1-50000 again:");
				number = scanner.nextInt();
			}else {
				break;
			}
		}
		
		boolean flag = isPowerNumber(number);
		if (flag) {
			System.out.println(number+"是2的阶次方数。");
		}else {
			System.out.println(number+"不是2的阶次方数。");
		}
	}
	
	//根据能被2整除的数的二进制数据的特点,前面为一个1后面为若干个0,如:1000表示十进制8可以被2整除,8-1=7,7的二进制表示为0111,两者相与全部为0
	private static boolean isPowerNumber(int number) {
		if (number!=0 && (number&(number-1))==0) {
			return true;
		}
		return false;
	}

}
</span>
运行结果:

是2的阶次方

不是2的阶次方


程序2:

<span style="font-size:18px;">package tong.yue.recursive;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class ArrayCombination {

	/**
	 * 列出一个数组中所有元素的组合,比如1、2、3列出来为1、12、123、13、132、2、21、213、23、231、3、31、312、32、321
	 * @param args
	 */
	public static void main(String[] args) {
		String[] strings =new String[]{"2","3","4","5"};
		listAll(Arrays.asList(strings),"");
				
	}
	//采用递归方法将一个数组中的所有元素组合全部列出
	private static void listAll(List<String> asList, String string) {
		System.out.println(string);
		for (int i = 0; i < asList.size(); i++) {
			List<String> tempList = new LinkedList<String>(asList);
			listAll(tempList, string+tempList.remove(i));
		}
		
	}

}
</span>
运行结果:

组合数


程序3:

<span style="font-size:18px;">package tong.yue.StringCountChar;

import java.beans.beancontext.BeanContext;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;

public class CharCountRank {

	/**
	 * 求出一个字符串中出现次数最多的那个字母及其出现的次数,如果有多个字符出现的次数相同,也列出这多个字符。
	 * 一个字符串中可能包含a-z中的多个字符,如果有重复字符,如String="aaJSjaotttttjdadjcjiaf",即可列出。
	 * 题目解析:将字符串转换为char数组,然后将每个字符放在TreeSet和ArrayList中, 因为TreeSet本身就有排序功能,添加进去char默认排好序的,而且这个集合是不能有重复元素的,所以相同的字符只能存储一次,而ArrayList中可以存储重复的char。
	 * 我们利用Collections.sort()函数将ArrayList中的字符进行排序,那么相同的字符就一定是相邻的。
	 * 然后循环遍历TreeSet集合中的元素,查找该元素在ArrayList中第一次和最后一次出现的位置,该字符出现的次数=最后一次出现的次数-第一次出现的次数+1
	 * 将出现次数最多的字符存放进另一个ArrayList,并记录好字符出现的最大次数,最后打印输出。
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一段英文字符串:");
		String string = scanner.nextLine();
		statisticsCharRank(string);

	}
	/**
	 * 将字符串转换为char数组,然后将每个字符放在TreeSet和ArrayList中,
	 * 因为TreeSet本身就有排序功能,添加进去char默认排好序的,而且这个集合是不能有重复元素的,所以相同的字符只能存储一次,而ArrayList中可以存储重复的char。
	 * 我们利用Collections.sort()函数将ArrayList中的字符进行排序,那么相同的字符就一定是相邻的。
	 * 然后循环遍历TreeSet集合中的元素,查找该元素在ArrayList中第一次和最后一次出现的位置,该字符出现的次数=最后一次出现的次数-第一次出现的次数+1
	 * 将出现次数最多的字符存放进另一个ArrayList,并记录好字符出现的最大次数,最后打印输出。
	 * 例如:
	 * treeSet:[A, D, F, I, J, O, a, d, h, i, o]
		排序后的arrayList:[A, D, D, D, D, D, F, I, I, I, I, I, I, I, I, I, I, J, O, O, a, a, a, d, d, d, h, i, i, i, o, o, o]
	 	arrayList中相同字符的位置相邻
	 * @param string
	 */
	private static void statisticsCharRank(String string) {
		char[] chars = string.toCharArray();
		TreeSet treeSet = new TreeSet();
		ArrayList arrayList = new ArrayList();
		for (int i = 0; i < chars.length; i++) {
			treeSet.add(String.valueOf(chars[i]));
			arrayList.add(String.valueOf(chars[i]));
		}
		System.out.println("treeSet:"+treeSet);
		Collections.sort(arrayList);
		System.out.println("排序后的arrayList:"+arrayList);
		String inputString = arrayList.toString();
		
		//用一个ArrayList来存放多个统计数最大的字符
		ArrayList arrayListMax = new ArrayList();		
		int max = 0;
		String maxString="";
		//循环遍历treeSet,判断每个字符在arrayList第一次和最后一次出现的位置以此判定字符出现次数
		Iterator iterator = treeSet.iterator();
		while (iterator.hasNext()) {
			String object = (String) iterator.next();
			//该字符第一次出现的位置
			int beginIndex = arrayList.indexOf(object);
			//该字符最后一次出现的位置
			int lastIndex = arrayList.lastIndexOf(object);
			//该字符出现的次数统计
			int value = lastIndex-beginIndex+1;
			if (max < value) {
				//出现了新的次数最多的字符,那把之前arrayListMax中记录的元素清空,加入当前元素
				max = value;
				maxString = object;
				arrayListMax.clear();
				arrayListMax.add(object);				
			}else if (max==value) {
				//如果不同字符出现的次数相同,也把这个元素加入arrayListMax
				arrayListMax.add(object);
			}
		}
		System.out.print("出现最多的字符为:");
		System.out.print(arrayListMax);
		System.out.println("\n出现的次数为:"+max);
		
	}

}
</span>
运行结果:

统计最多次数不同

统计最多次数相同


   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值