一、描述
题目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>
运行结果: