常见算法题目
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();
}
}
}