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+" ");
}
}
其实每道题目都有多种实现的方法,主要取决于你如何看待问题。。。