13 道典型 Java 面试算法题及解答

  1. 人民币金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出
  2. 判断身份证:要么是15位,要么是18位,最后一位可以为字母,并写程序提出其中的年月日。
  3. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。
  4. 给定一个四句古诗,程序实现从每一句中随机挖去一个字,并顺序打乱生成四个选项。从而随机生成一个填字题目。
  5. 统计一篇英文文章中单词个数
  6. 给定任意长度的字符串,字符串中可以有任意顺序和任意个数的任意字符。要求去除重复只留下唯一的字符并升序排序。比如:aabbxxcaaccyyxxxyydddd 输出结果为:abcdxy
  7. 全排列:给出五个数字 12345 的所有排列
  8. 回文素数:所谓回文数就是顺着读和倒着读一样的数(例如:11,121,1991…),回文素数就是既是回文数又是素数(只能被 1 和自身整除的数)的数。编程找出11~9999 之间的回文素数。
  9. 给一个任意的字符串,如果统计出每个字符出现的次数?
  10. 有一串无序的任意序列字符串,包含了一些特殊字符,现在需要去除特殊字符,只留下数字字母下划线。
  11. 写一个算法判断一个英文单词的所有字母是否全都不同(不区分大小写)
  12. 一个有 n 级的台阶,一次可以走 1 级、2 级或 3 级,问走完 n 级台阶有多少种走法。
  13. 编写一个程序,统计文本文件中内容的总行数?

人民币转换

1. 人民币金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。

思路:

人民币从阿拉伯数字转为大写中文,这就需要首先解决 0~9 到 壹~玖之间的映射。

这种映射,可以通过数组来解决即可。

而还有要考虑的问题是,元拾佰仟的转换问题。这个可以结合数组及位数来实现。每多一位则从数组中依次往后取出单位拼接到结果字符串中。

package test;

public class RenMingBi {
   

	private static final char[] data = new char[]{
   	'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'	}; 
	private static final char[] units = new char[]{
   	'元','拾','佰','仟','万','拾','佰','仟','亿'};
	public static void main(String[] args) {
   
		// TODO Auto-generated method stub
		System.out.println(
				convert(100000003));
	}

	public static String convert(int money)
	{
   
		StringBuffer sbf = new StringBuffer();
		int unit = 0;
		while(money!=0)
		{
   
			sbf.insert(0,units[unit++]);
			int number = money%10;
			sbf.insert(0, data[number]);
			money /= 10;
		}

        return sbf.toString().replaceAll("零[拾佰仟]","零")
                .replaceAll("零+万","万")
                .replaceAll("亿万","亿")
                .replaceAll("零+元","元")
                .replaceAll("零+","零");
	}
}

字符串、正则表达式等其他问题

2. 判断身份证:要么是15位,要么是18位,最后一位可以为字母,并写程序提出其中的年月日。

思路:

首先需要了解正则表达式,\d 表示数字。{n,m}表示字符个数。

可以使用正则表达式从第6位之后开始截取 8 位即可取出年月日。

package com.demo2;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {
   

	public static void main(String[] args) {
   

		// 测试是否为合法的身份证号码
		String[] strs = {
    "130681198712092019", "13068119871209201x", "13068119871209201", "123456789012345",
				"12345678901234x", "1234567890123" };
		Pattern p1 = Pattern.compile("(\\d{17}[0-9a-zA-Z]|\\d{14}[0-9a-zA-Z])");
		for (int i = 0; i < strs.length; i++) {
   
			Matcher matcher = p1.matcher(strs[i]);
			System.out.println(strs[i] + ":" + matcher.matches());
		}

		Pattern p2 = Pattern.compile("\\d{6}(\\d{8}).*"); // 用于提取出生日字符串
		Pattern p3 = Pattern.compile("(\\d{4})(\\d{2})(\\d{2})");// 用于将生日字符串进行分解为年月日
		for (int i = 0; i < strs.length; i++) {
   
			Matcher matcher = p2.matcher(strs[i]);
			boolean b = matcher.find();
			if (b) {
   
				String s = matcher.group(1);
				Matcher matcher2 = p3.matcher(s);
				if (matcher2.find()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zp8126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值