标签:java源代码 判定数字是否为2的阶次方 列出所有元素组合 统计字符串中出现次数最多的字符 treeset和arraylist
一、描述
题目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:
<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>运行结果:
标签:java源代码 判定数字是否为2的阶次方 列出所有元素组合 统计字符串中出现次数最多的字符 treeset和arraylist
原文地址:http://blog.csdn.net/tongyuehong137/article/details/45127359