常见算法题目

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)

原理分析:

常见算法题目_数字字符_02

代码编写:

 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"

原理分析:

常见算法题目_字符串_03

代码编写:

 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();
        }
    }
 }