一、描述
題目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>
運行結果: