java基础经典编程题

1. 有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。

public static void getStr(String str) {
		//各种中字符串
		StringBuilder hanziStr = new StringBuilder();
		StringBuilder enStr = new StringBuilder();
		StringBuilder numStr = new StringBuilder();
		//保存字符变量
		char ch;
		for(int i=0;i<str.length();i++) {
			//使用Character.getType()获取字符的类型
			ch = str.charAt(i);
			//判断这个字符的类型,添加到对应的字符串中
			switch(Character.getType(ch)) {
			case 1://大写字母
				enStr.append(ch);
				break;
			case 2://小写字母
				enStr.append(ch);
				break;
			case 5://中文字符
				hanziStr.append(ch);
				break;
			case 9://数字
				numStr.append(ch);
				break;
			default:
				break;
			}
		}
		//打印各种字符串及其长度
		System.out.println("中文\t英文\t数字");
		System.out.println(hanziStr.length()+"\t"+enStr.length()+"\t"+numStr.length());
		
		printCh(hanziStr);
		printCh(enStr);
		printCh(numStr);
	}
	/**
	 * 打印StringBuilder每个字符的方法
	 */
	public static void printCh(StringBuilder sb) {
		
		for(int i = 0;i < sb.length();i ++) {
			System.out.print(sb.charAt(i)+" ");
		}
		System.out.println();
	}

上面的方法既可以按字符种类做统计,又对各种字符进行了展示。再看另外一种方法:

public static void getStr2(String str) {
		HashMap map = new HashMap();
		for(int i=0;i<str.length();i++) {
			char c = str.charAt(i);
			Integer num = (Integer) map.get(c);
			if(null == num){
				num =1;
			}else {
				num = num +1;
			}
			map.put(c, num);
		}
		Set set = map.entrySet();
		for (Object key : map.keySet()) {
			System.out.println(key+": "+map.get(key));
		}
		
	}

此方法对出现的不同字符进行了统计展示。

2. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。

public static void getStr(String s,int len) {
		int byteNum = 0;
		if(null == s) {
			System.out.println("字符串为null。。。");
			return;
		}
		byteNum =s.length();
		//将string转换成byte字节数组
		byte[] bs = s.getBytes();
		if(len > byteNum) {
			len = byteNum;
		}
		//判断是否出现了截半,截半的话字节对于的ASC码是小于0的值
		if(bs[len]<0) {
			String subStr = new String(bs,0,--len);
			System.out.println("截取的字符串为: "+subStr);
		}else {
			String subStr = new String(bs,0,len);
			System.out.println("截取的字符串为: "+subStr);
		}
	}

3.( 递归算法题1)一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。例:n=1237
则输出为:1237,2474,4948,9896,9896,4948,2474,1237,

public static void getNum(int n) {
		if(n>5000) return;
		System.out.println(n);
		getNum(n*2);
		System.out.println(n);
	}

4.( 递归算法题2)  第1个人10,第2个比第1个人大2岁,依次递推,请用递归方式计算出第8个人多大?

public static Integer getAge(int n) {
		int total=0;
		if(n == 1) {
			return 10;
		}else {
			total=getAge(n-1)+2;
		}
		return total;
	}

5. 从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序:
        1,张三,28
        2,李四,35
        3,张三,28
        4,王五,35
        5,张三,28
        6,李四,35
        7,赵六,28
        8,田七,35

public static void getName() {
		//info.txt与GetNameTest类在同一包下面,所以,可以用下面的相对路径形式
		InputStream ips = GetNameTest.class.getResourceAsStream("info.txt");
		Map results = new HashMap();
		BufferedReader in = new BufferedReader(new InputStreamReader(ips));
		String line = null;
		try {
			while((line=in.readLine())!= null) {
				dealLine(line,results);
			}
			sortResults(results);
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
	static class User{
		public  String name;
		public Integer value;
		public User(String name,Integer value){
			this.name = name;
			this.value = value;
		}
		@Override
		public boolean equals(Object obj) {
			//下面的代码没有执行,说明往treeset中增加数据时,不会使用到equals方法。
			boolean result = super.equals(obj);
			System.out.println(result);
			return result;
		}
	}
	
	
	private static void sortResults(Map results) {
		// TODO Auto-generated method stub
		TreeSet sortedResults = new TreeSet(
			new Comparator(){
				public int compare(Object o1, Object o2) {
					// TODO Auto-generated method stub
					User user1 = (User)o1;
					User user2 = (User)o2;
	/*如果compareTo返回结果0,则认为两个对象相等,新的对象不会增加到集合中去
	 * 所以,不能直接用下面的代码,否则,那些个数相同的其他姓名就打印不出来。* */
					//return user1.value-user2.value;
					//return user1.value<user2.value?-1:user1.value==user2.value?0:1;
					if(user1.value<user2.value){
						return -1;
					}else if(user1.value>user2.value){
						return 1;
					}else{
						return user1.name.compareTo(user2.name);
					}
				}
				
			}
		);
		Iterator iterator = results.keySet().iterator();
		while(iterator.hasNext()){
			String name = (String)iterator.next();
			Integer value = (Integer)results.get(name);
			if(value > 1){				
				sortedResults.add(new User(name,value));				
			}
		}
		
		printResults(sortedResults);
	}
	private static void printResults(TreeSet sortedResults) {
		Iterator iterator  = sortedResults.iterator();
		while(iterator.hasNext()){
			User user = (User)iterator.next();
			System.out.println(user.name + ":" + user.value);
		}	
	}
	public static void dealLine(String line,Map map){
		if(!"".equals(line.trim())){
			String [] results = line.split(",");
			if(results.length == 3){
				String name = results[1];
				Integer value = (Integer)map.get(name);
				if(value == null) value = 0;
				map.put(name,value + 1);
			}
		}
	}

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

private static final char[] data = new char[]{
			'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'
		}; 
	private static final char[] units = new char[]{
		'元','拾','佰','仟','万','拾','佰','仟','亿'
	};
	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("零+", "零").replaceAll("亿万", "亿");
	}

7. 有数组a[n],用java代码将数组元素顺序颠倒

​
int a[]={11,8,2,24,90,23};
//方法一
for (int i=a.length-1;i>=0;i--) {
		System.out.print(a[i]+"\t");
}
//方法二
public static void reverse(int[] arr) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		for(Integer i : arr) {
			list.add(i);
		}
		Collections.reverse(list);
		for(Integer j:list) {
			System.out.print(j+" ");
		}
	}

​

其实每道题目都有多种实现的方法,主要取决于你如何看待问题。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值