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>
運行結果:

統計最多次數不同

統計最多次數相同


   

發佈了91 篇原創文章 · 獲贊 27 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章