1. 程式人生 > 其它 >常見演算法題目

常見演算法題目

常見演算法題目

1.將一個7進位制數 "123" 轉換為一個int整數(不要使用API)

原理分析:

程式碼編寫:

package list;

public class Demo11 {
public static void main(String[] args) {
/**
* 7進位制123轉int
*/
//1.用API實現
int n = Integer.parseInt("123",7);
System.out.println(n);//按照10進位制輸出

//2.用自定義的方法實現
n = parseInt("123",7);
System.out.println(n);
}

/**
* 進行進位制轉換
* @param num 要轉化的字串
* @param radix 基數
* @return
*/
public static int parseInt(String num, int radix){
//判斷是否是負數
boolean negative = num.charAt(0)=='-';
//負數時去除負號,正數時保留原數
num = negative ? num.substring(1) : num;
int sum = 0;//總和
int weight = 1;//權重
//從最低位開始遍歷
for (int i = num.length()-1; i >= 0; i--) {
char c = num.charAt(i);//獲得該位的字元
int n = c - '0';//字元轉數字
//數字小於0或者數字大於基數,丟擲異常
if(n<0 || n>=radix){
throw new NumberFormatException("數字錯誤:"+c);
}
sum += n * weight;//求和
weight *= radix;//更新權重
}
return negative ? -sum : sum;//負數時取相反數
}
}

2.將一個整數轉換為7進位制字串(不要使用Java API)

原理分析:

程式碼編寫:

package list;

public class Demo12 {
public static void main(String[] args) {
/**
* 將一個整數轉換為7進位制
*/
//1.用API實現
int n = 66;
String str = Integer.toString(n,7);
System.out.println(str);

//2.用自定義的方法實現
str = toString(n,7);
System.out.println(str);
}

/**
* 將整數轉化為radix進位制字串
* @param n
* @param radix 基數/進位制
* @return
*/
public static String toString(int n,int radix){
//判斷是否是負數
boolean negative = n<0;
n = negative ? -n : n;
//定義字元陣列,分別對應0-9a-f 16進位制 注意:此時字元陣列的處理速度高於StringBuilder;-n優於(-1)*n
char[] digi = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
//定義一個數組,用於儲存轉換的結果 int最多轉換為32位
char[] chs = new char[32];
//定位到陣列最後一位
int index = chs.length - 1;
do{
int last = n%radix; //取出餘數作為最後一位數字
char c = digi[last]; //從字元陣列中取字元,將數字轉換為字元
chs[index--] = c; //將轉換的字元儲存到字元陣列中,從最後面開始存
n /= radix; //去除轉換完成的資料(每次除以基數,作為下次計算的起點)
}while (n!=0);//當n=0時結束迴圈
if(negative){//當為負數的時候需要把-加進去
chs[index--] = '-';
}
//將轉換得到的字元陣列, 轉換為字串, 作為結果
// 字元陣列 起始長度 字元個數
String str = new String(chs, index+1, chs.length-index-1);
return str;
}
}

3.統計一個字串中每個英文大寫字母出現的次數

例子: "測試abcABC123ABCEDF"

原理分析:

程式碼編寫:

package list;

/**
* 統計一個字串中每個英文大寫字母出現的次數
*/
public class Demo13 {
public static void main(String[] args) {
//測試字串
String str = "AABBCCDDEEaabbccddee1122334455好好學習天天向上";
//呼叫統計大寫字母出現次數方法
countUpper(str);
}

/**
* 統計大寫字母出現次數
* @param str
*/
public static void countUpper(String str){
//新建陣列,每個元素代表大寫字母出現的次數,預設次數為0
int[] counter = new int[26];
//遍歷字串
for (int i = 0; i < str.length(); i++) {
//取出每個位置的字元
char ch = str.charAt(i);
//判斷是否為大寫字母
if(ch>='A' && ch<='Z'){
//對應大寫字母位置個數+1 ch-'A'=該字母所對應位置的陣列下標
counter[ch-'A']++;
}
}
//起始位置
char c = 'A';
//遍歷輸出
for (int i:counter) {
//c++ 每次+1變為下一個大寫字母,i對應出現次數
System.out.println((c++)+":"+i);
}
}
}

4.統計一個字串中每個數字字元出現的次數

程式碼編寫:

package list;

/**
* 統計一個字串中每個數字字元出現的次數
*/
public class Demo14 {
public static void main(String[] args) {
//測試字串
String str = "AABBCCDDEEaabbccddee1122334455好好學習天天向上";
//呼叫統計數字字元出現次數方法
countNumber(str);
}

/**
* 統計數字字元出現次數
* @param str
*/
public static void countNumber(String str){
//新建陣列,每個元素代表每個數字出現的次數,預設次數為0
int[] counter = new int[10];
//遍歷字串
for (int i = 0; i < str.length(); i++) {
//取出每個位置的字元
char ch = str.charAt(i);
//判斷是否為數字字元
if(ch>='0' && ch<='9'){
//對應數字字元位置個數+1 ch-'0'=該字元所對應位置的陣列下標
counter[ch-'0']++;
}
}
for (int i = 0; i <= 9; i++) {
System.out.println(i+":"+counter[i]);
}
}
}

5.從一個文字檔案(UTF-8)中統計每個英文大寫字元個數

程式碼編寫:

package list;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

/**
* 從一個文字檔案(UTF-8編碼格式)中統計每個英文大寫字元個數
*/
public class Demo15 {
public static void main(String[] args) {
//注意:檔案預設路徑為與.idea、out、src同級的檔案
String file = "src/list/就業衝刺3.md";
try(
//InputStreamReader要指定字符集UTF-8,此處相當於解碼檔案
BufferedReader reader = new BufferedReader(
new InputStreamReader(
new BufferedInputStream(
new FileInputStream(file)),"UTF-8"));
){
//宣告記錄大寫字母出現次數的陣列
int[] counter = new int[26];
//記錄讀取到字元的長度
int ch;
//遍歷檔案
while ((ch = reader.read())!=-1){//未讀取到檔案末尾
System.out.print((char)ch);//輸出讀取到的字元
if(ch>='A' && ch<='Z'){
counter[ch - 'A']++;//在指定位置記錄出現的次數
}
}
//指定起始位置,開始遍歷輸出
char c = 'A';
for (int n:counter) {
System.out.println((c++)+":"+n);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}