论坛首页 Java企业应用论坛

面试题目

浏览 32990 次
锁定老帖子 主题:面试题目
精华帖 (0) :: 良好帖 (0) :: 新手帖 (16) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-08-01  
meiwf520 写道
evabibi 写道
public static void main(String[] args) {
		 String s= "sdfsddddddddddfffff,sdfsdf,"; 
		 s=s.replaceAll("[^a-zA-Z]","");
		 int max = 0;
		 int temp = 0;
		 String tempString = "";
		 for(int i = 0 ;i<s.length() ; i++ ){
			 tempString = s.substring(0,1);
			 String subs = s.replace(s.substring(0,1),"");
			 temp = s.length() - subs.length();
			 if(max<temp){
				 max=temp;
			 }
			 s = subs;
		 }
		 System.out.println(tempString+" max= "+max);
}


>_<

运行了下,不正确呀!

确实不正确,tempString是获取到最后一次循环截取都字符串,max倒是 正确了。
0 请登录后投票
   发表时间:2009-08-02   最后修改:2009-08-02
楼主的好复杂啊

public static void main(String[] args) {
		String str = "tx.tCEsfuio.RIKj.pRGClSBXm.sgSAdm.hbzbmypE.sUGJuXrb.ALABN";
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		for (Character ch : str.replaceAll("[^A-Za-z]", "").toCharArray()) {
			Integer freq = map.get(ch);
			map.put(ch, freq == null ? 1 : freq + 1);
		}
		int max = Collections.max(map.values());
		int min = Collections.min(map.values());
		Set<Character> maxChars = new HashSet<Character>();
		Set<Character> minChars = new HashSet<Character>();
		for (Map.Entry<Character, Integer> entry : map.entrySet()) {
			if (entry.getValue().equals(max)) {
				maxChars.add(entry.getKey());
			}
			if (entry.getValue().equals(min)) {
				minChars.add(entry.getKey());
			}
		}
		System.out.println("max: " + max);
		System.out.println("max character(s):" + maxChars);
		System.out.println("min: " + min);
		System.out.println("min character(s):" + minChars);
	}

运行结果:

max: 3
max character(s):[s, b, A, m]
min: 1
min character(s):[f, g, d, L, o, N, l, j, I, J, h, i, K, U, r, z, y, x]
0 请登录后投票
   发表时间:2009-08-02  
是有点复杂,有很多方法。我粗略得写了下。感谢这么多朋友的拍砖。。学习
0 请登录后投票
   发表时间:2009-08-03  
可以申请一个(112-65)大小的数组来存储吧
O(n)的时间复杂度
0 请登录后投票
   发表时间:2009-08-03   最后修改:2009-08-03
Jiagoo 写道
meiwf520 写道
evabibi 写道
public static void main(String[] args) {
		 String s= "sdfsddddddddddfffff,sdfsdf,"; 
		 s=s.replaceAll("[^a-zA-Z]","");
		 int max = 0;
		 int temp = 0;
		 String tempString = "";
		 for(int i = 0 ;i<s.length() ; i++ ){
			 tempString = s.substring(0,1);
			 String subs = s.replace(s.substring(0,1),"");
			 temp = s.length() - subs.length();
			 if(max<temp){
				 max=temp;
			 }
			 s = subs;
		 }
		 System.out.println(tempString+" max= "+max);
}


>_<

运行了下,不正确呀!

确实不正确,tempString是获取到最后一次循环截取都字符串,max倒是 正确了。


public static void main(String[] args) {
		 String s= "sdfsddddddddddfffff,sdfsdf,"; 
		 s=s.replaceAll("[^a-zA-Z]","");
		 int max = 0;
		 int temp = 0;
		 String tempString = "";
                 String maxString = "";
		 for(int i = 0 ;i<s.length() ; i++ ){
			 tempString = s.substring(i,1);
			 String subs = s.replace(tempString,"");
			 temp = s.length() - subs.length();
			 if(max<temp){
				 max=temp;
				 maxString = tempString;
			 }
			 s = subs;
		 }
		 System.out.println(maxString+" max= "+max);
}


思路不错,貌似代码确实是最简洁的,但效率不是最高的,如果改写成递归,每一次调用自身时把重复的字符replace掉,那效率就高了。
0 请登录后投票
   发表时间:2009-08-03   最后修改:2009-08-03
首先evabibi方法本来就是错误的, 它根本没考虑字符出现次数相同的情况, 只会得出出现最多次数的最后一个字符

其次evabibi方法的效率也是很低的(当然代码的效率跟实际需求相关,如果字符串长度就100而言没必要谈效率)

在长度为10000的字符串情况下
evabibi方法需要的时间是32ms
我的方法是9ms

在长度1000000的字符串情况下
evabibi方法需要的时间是2017ms
我的方法是133ms

至于代码的简洁这个就见人见智了, 如果只求最大的出现次数的话我的方法只需要6行代码, 前面已经说了evabibi方法本来就是错误的

至于代码的阅读难度(可能跟简洁重复了), 我相信大家可以看一眼就明白我的方法在做什么, 至于evabibi的嘛, 说实话如果不是非必要我是不会想要去看理解它的意图的

欢迎大家拍砖, 我的方法不是最好的, 我相信有更好的方法, 我只是不明白为什么这样一个糟糕的方法却受到大家的追捧(而且是不正确的)

public class Ex {
	
	public static void main(String[] args) {
		String str10000 = RandomStringUtils.randomAlphanumeric(10000);
		evabibi(str10000);
		gordianyuan(str10000);
		String str1000000 = RandomStringUtils.randomAlphanumeric(1000000);
		evabibi(str1000000);
		gordianyuan(str1000000);
	}

	private static void gordianyuan(String str) {
		long startTime = System.currentTimeMillis();
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		for (Character ch : str.toCharArray()) {
			if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
				Integer freq = map.get(ch);
				map.put(ch, freq == null ? 1 : freq + 1);
			}
		}
		int max = Collections.max(map.values());
		int min = Collections.min(map.values());
		Set<Character> maxChars = new HashSet<Character>();
		Set<Character> minChars = new HashSet<Character>();
		for (Map.Entry<Character, Integer> entry : map.entrySet()) {
			if (entry.getValue().equals(max)) {
				maxChars.add(entry.getKey());
			}
			if (entry.getValue().equals(min)) {
				minChars.add(entry.getKey());
			}
		}
		System.out.println("max: " + max);
		System.out.println("max character(s):" + maxChars);
		System.out.println("min: " + min);
		System.out.println("min character(s):" + minChars);
		System.out.println("gordianyuan spend time: "
					+ (System.currentTimeMillis() - startTime));
	}

	public static void evabibi(String s) {
		long startTime = System.currentTimeMillis();
		s = s.replaceAll("[^a-zA-Z]", "");
		int max = 0;
		int temp = 0;
		String tempString = "";
		for (int i = 0; i < s.length(); i++) {
			tempString = s.substring(0, 1);
			String subs = s.replace(s.substring(0, 1), "");
			temp = s.length() - subs.length();
			if (max < temp) {
				max = temp;
			}
			s = subs;
		}
		System.out.println(tempString + " max= " + max);
		System.out.println("evabibi spend time: "
					+ (System.currentTimeMillis() - startTime));
	}

}
0 请登录后投票
   发表时间:2009-08-03  
\
gordianyuan 写道
首先evabibi方法本来就是错误的, 它根本没考虑字符出现次数相同的情况, 只会得出出现最多次数的最后一个字符

其次evabibi方法的效率也是很低的(当然代码的效率跟实际需求相关,如果字符串长度就100而言没必要谈效率)

在长度为10000的字符串情况下
evabibi方法需要的时间是32ms
我的方法是9ms

在长度1000000的字符串情况下
evabibi方法需要的时间是2017ms
我的方法是133ms

至于代码的简洁这个就见人见智了, 如果只求最大的出现次数的话我的方法只需要6行代码, 前面已经说了evabibi方法本来就是错误的

至于代码的阅读难度(可能跟简洁重复了), 我相信大家可以看一眼就明白我的方法在做什么, 至于evabibi的嘛, 说实话如果不是非必要我是不会想要去看理解它的意图的

欢迎大家拍砖, 我的方法不是最好的, 我相信有更好的方法, 我只是不明白为什么这样一个糟糕的方法却受到大家的追捧(而且是不正确的)

public class Ex {
	
	public static void main(String[] args) {
		String str10000 = RandomStringUtils.randomAlphanumeric(10000);
		evabibi(str10000);
		gordianyuan(str10000);
		String str1000000 = RandomStringUtils.randomAlphanumeric(1000000);
		evabibi(str1000000);
		gordianyuan(str1000000);
	}

	private static void gordianyuan(String str) {
		long startTime = System.currentTimeMillis();
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		for (Character ch : str.toCharArray()) {
			if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
				Integer freq = map.get(ch);
				map.put(ch, freq == null ? 1 : freq + 1);
			}
		}
		int max = Collections.max(map.values());
		int min = Collections.min(map.values());
		Set<Character> maxChars = new HashSet<Character>();
		Set<Character> minChars = new HashSet<Character>();
		for (Map.Entry<Character, Integer> entry : map.entrySet()) {
			if (entry.getValue().equals(max)) {
				maxChars.add(entry.getKey());
			}
			if (entry.getValue().equals(min)) {
				minChars.add(entry.getKey());
			}
		}
		System.out.println("max: " + max);
		System.out.println("max character(s):" + maxChars);
		System.out.println("min: " + min);
		System.out.println("min character(s):" + minChars);
		System.out.println("gordianyuan spend time: "
					+ (System.currentTimeMillis() - startTime));
	}

	public static void evabibi(String s) {
		long startTime = System.currentTimeMillis();
		s = s.replaceAll("[^a-zA-Z]", "");
		int max = 0;
		int temp = 0;
		String tempString = "";
		for (int i = 0; i < s.length(); i++) {
			tempString = s.substring(0, 1);
			String subs = s.replace(s.substring(0, 1), "");
			temp = s.length() - subs.length();
			if (max < temp) {
				max = temp;
			}
			s = subs;
		}
		System.out.println(tempString + " max= " + max);
		System.out.println("evabibi spend time: "
					+ (System.currentTimeMillis() - startTime));
	}

}


去掉Min部分
import org.apache.commons.lang.*;
import java.util.*;

public class Main {

	public static void main(String[] args) {
		String str10000 = RandomStringUtils.randomAlphanumeric(100000);
		gordianyuan(str10000);
	}

	private static void gordianyuan(String str) {
		long startTime = System.nanoTime();
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		for (Character ch : str.toCharArray()) {
			if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
				Integer freq = map.get(ch);
				map.put(ch, freq == null ? 1 : freq + 1);
			}
		}
		int max = Collections.max(map.values());
		Set<Character> maxChars = new HashSet<Character>();
		for (Map.Entry<Character, Integer> entry : map.entrySet()) {
			if (entry.getValue().equals(max)) {
				maxChars.add(entry.getKey());
			}
		}
		System.out.println("max: " + max);
		System.out.println("max character(s):" + maxChars);
		System.out.println("gordianyuan spend time: "
				+ (System.nanoTime() - startTime));
	}
}


用数组重写
import org.apache.commons.lang.RandomStringUtils;

public class Main2 {
	private static long result[] = new long[60];

	private static int index = 0;

	private static long max = -1;

	public static void main(String[] args) {
		count(RandomStringUtils.randomAlphanumeric(100000));
	}

	private static void count(String content) {
		long startTime = System.nanoTime();
		for (char temp : content.toCharArray()) {
			if ((temp >= 65 && temp <= 90) || (temp >= 97 && temp <= 122)) {
				temp -= 65;
				result[temp]++;
			}
		}
		for (int i = 0; i < result.length; i++) {
			if (result[i] > max) {
				index = i;
				max = result[i];
			}
		}
		System.out.println((char) (index + 67));
		System.out.println(max);
		System.out.println("KimShen spend time: " + (System.nanoTime() - startTime));
	}
}



运行3次
gordianyuan spend time: 31178824
gordianyuan spend time: 31477744
gordianyuan spend time: 29229972

KimShen spend time:     8187074
KimShen spend time:     8156065
KimShen spend time:     8584890

我很自豪,我秒杀你了。
但问题是这样吗?

你认为谁的可读性更好? 速度固然重要,可读性更加重要。


0 请登录后投票
   发表时间:2009-08-03   最后修改:2009-08-03
首先我不是针对谁, 我只是谈论程序, 如果我说的有什么得罪的地方我先道歉

KimShen, 如果其他人推崇的是的你方法我没什么意见, 我是针对evabibi的方法,
KimShen你的方法不错, 不过有几点可以再改善一下
1.不要使用magic number.
2.你的方法如果遇到字符串, 例如"oopp", 你的方法就是错误的, 你只能求出最大字符为'p', 程序的正确性比一切都重要.
当然这个问题改起来不难, 但这并不能成为你出错的理由.

程序的可读性我就不说了, 大家自己评价吧

先来我的方法
Map<Character, Integer> map = new HashMap<Character, Integer>();  
for (Character ch : str.toCharArray()) {  
   if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {  
     Integer freq = map.get(ch);  
        map.put(ch, freq == null ? 1 : freq + 1);  
    } 
 }  
 int max = Collections.max(map.values());  
 System.out.println("max: " + max);  


KimShen的方法
 long result[] = new long[60];  
 for (char temp : content.toCharArray())  {  
           if ((temp >= 65 && temp <= 90) || (temp >= 97 && temp <= 122)) {  
               temp -= 65;  
               result[temp]++;  
            }  
       }  
        for (int i = 0; i < result.length; i++) {  
            if (result[i] > max) {  
               index = i;  
           }  
        }  
       System.out.println(max);  


我去掉了max char(s), 为什么呢? 前面已经说了KimShen的方法是错误的.

对于效率我无话可说, 你的效率是很高的, 也完全符合需求, 但我前面已经说了, "代码的效率跟实际需求相关,如果字符串长度就100而言没必要谈效率", 但如果没有确切的性能需求, 我更喜欢我的方法, 保留了可读性, 前面讨论效率是因为
在长度1000000的字符串情况下
evabibi方法需要的时间是2017ms
我的方法是133ms

可能KimShen没有看到我最后的一句话,  欢迎大家拍砖, 我的方法不是最好的, 我相信有更好的方法, 我只是不明白为什么这样一个糟糕的方法却受到大家的追捧(而且是不正确的) 

KimShen 写道
\
gordianyuan 写道
首先evabibi方法本来就是错误的, 它根本没考虑字符出现次数相同的情况, 只会得出出现最多次数的最后一个字符

其次evabibi方法的效率也是很低的(当然代码的效率跟实际需求相关,如果字符串长度就100而言没必要谈效率)

在长度为10000的字符串情况下
evabibi方法需要的时间是32ms
我的方法是9ms

在长度1000000的字符串情况下
evabibi方法需要的时间是2017ms
我的方法是133ms

至于代码的简洁这个就见人见智了, 如果只求最大的出现次数的话我的方法只需要6行代码, 前面已经说了evabibi方法本来就是错误的

至于代码的阅读难度(可能跟简洁重复了), 我相信大家可以看一眼就明白我的方法在做什么, 至于evabibi的嘛, 说实话如果不是非必要我是不会想要去看理解它的意图的

欢迎大家拍砖, 我的方法不是最好的, 我相信有更好的方法, 我只是不明白为什么这样一个糟糕的方法却受到大家的追捧(而且是不正确的)

public class Ex {
	
	public static void main(String[] args) {
		String str10000 = RandomStringUtils.randomAlphanumeric(10000);
		evabibi(str10000);
		gordianyuan(str10000);
		String str1000000 = RandomStringUtils.randomAlphanumeric(1000000);
		evabibi(str1000000);
		gordianyuan(str1000000);
	}

	private static void gordianyuan(String str) {
		long startTime = System.currentTimeMillis();
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		for (Character ch : str.toCharArray()) {
			if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
				Integer freq = map.get(ch);
				map.put(ch, freq == null ? 1 : freq + 1);
			}
		}
		int max = Collections.max(map.values());
		int min = Collections.min(map.values());
		Set<Character> maxChars = new HashSet<Character>();
		Set<Character> minChars = new HashSet<Character>();
		for (Map.Entry<Character, Integer> entry : map.entrySet()) {
			if (entry.getValue().equals(max)) {
				maxChars.add(entry.getKey());
			}
			if (entry.getValue().equals(min)) {
				minChars.add(entry.getKey());
			}
		}
		System.out.println("max: " + max);
		System.out.println("max character(s):" + maxChars);
		System.out.println("min: " + min);
		System.out.println("min character(s):" + minChars);
		System.out.println("gordianyuan spend time: "
					+ (System.currentTimeMillis() - startTime));
	}

	public static void evabibi(String s) {
		long startTime = System.currentTimeMillis();
		s = s.replaceAll("[^a-zA-Z]", "");
		int max = 0;
		int temp = 0;
		String tempString = "";
		for (int i = 0; i < s.length(); i++) {
			tempString = s.substring(0, 1);
			String subs = s.replace(s.substring(0, 1), "");
			temp = s.length() - subs.length();
			if (max < temp) {
				max = temp;
			}
			s = subs;
		}
		System.out.println(tempString + " max= " + max);
		System.out.println("evabibi spend time: "
					+ (System.currentTimeMillis() - startTime));
	}

}


去掉Min部分
import org.apache.commons.lang.*;
import java.util.*;

public class Main {

	public static void main(String[] args) {
		String str10000 = RandomStringUtils.randomAlphanumeric(100000);
		gordianyuan(str10000);
	}

	private static void gordianyuan(String str) {
		long startTime = System.nanoTime();
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		for (Character ch : str.toCharArray()) {
			if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
				Integer freq = map.get(ch);
				map.put(ch, freq == null ? 1 : freq + 1);
			}
		}
		int max = Collections.max(map.values());
		Set<Character> maxChars = new HashSet<Character>();
		for (Map.Entry<Character, Integer> entry : map.entrySet()) {
			if (entry.getValue().equals(max)) {
				maxChars.add(entry.getKey());
			}
		}
		System.out.println("max: " + max);
		System.out.println("max character(s):" + maxChars);
		System.out.println("gordianyuan spend time: "
				+ (System.nanoTime() - startTime));
	}
}


用数组重写
import org.apache.commons.lang.RandomStringUtils;

public class Main2 {
	private static long result[] = new long[60];

	private static int index = 0;

	private static long max = -1;

	public static void main(String[] args) {
		count(RandomStringUtils.randomAlphanumeric(100000));
	}

	private static void count(String content) {
		long startTime = System.nanoTime();
		for (char temp : content.toCharArray()) {
			if ((temp >= 65 && temp <= 90) || (temp >= 97 && temp <= 122)) {
				temp -= 65;
				result[temp]++;
			}
		}
		for (int i = 0; i < result.length; i++) {
			if (result[i] > max) {
				index = i;
				max = result[i];
			}
		}
		System.out.println((char) (index + 67));
		System.out.println(max);
		System.out.println("KimShen spend time: " + (System.nanoTime() - startTime));
	}
}



运行3次
gordianyuan spend time: 31178824
gordianyuan spend time: 31477744
gordianyuan spend time: 29229972

KimShen spend time:     8187074
KimShen spend time:     8156065
KimShen spend time:     8584890

我很自豪,我秒杀你了。
但问题是这样吗?

你认为谁的可读性更好? 速度固然重要,可读性更加重要。



0 请登录后投票
   发表时间:2009-08-04  
这个是我的感觉还可以楼主不妨看下能实现你说的
/**
* 判断并打出输入的字符串中 出现最多的字符和数量
* @param ch
*/
public void NumMaxChar(String ch) {
Map<String, Integer> sum = new HashMap<String, Integer>();
Pattern pattern = Pattern.compile("[a-zA-Z]");
for (int i = 0; i < ch.length(); i++) {
char num = ch.charAt(i);
String su = String.valueOf(num);
Matcher matcher = pattern.matcher(su);

boolean b = matcher.matches();
if (b) {
int fo = 0;
if (sum.get(su) != null) {
fo = sum.get(su);
}
if (fo == 0) {
sum.put(su, 1);
} else {
fo = fo+1;
sum.put(su, fo);
}
}
}
List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(
sum.entrySet());
String key="";
int max=0;
for (int i = 0; i < list.size(); i++) {
//String id=list.get(i).toString();
int ok=max-list.get(i).getValue();
if(ok<0){
key=list.get(i).getKey();
max=list.get(i).getValue();
}
//System.out.println(id);
//System.out.println("最大的字母为:"+key+"它的值为"+max);
}
System.out.println("出现最多的字母为:"+key+"----出现次数为:"+max);
}
0 请登录后投票
   发表时间:2009-08-04  
先定义一个对象,如下:
MaxCount.java

package yeku;

public class MaxCount {
	
	private String appearChar;
	private int appearCount;
	
	public MaxCount(){
		this.appearCount = 0;
	}
	
	public String getAppearChar() {
		return appearChar;
	}
	public void setAppearChar(String appearChar) {
		this.appearChar = appearChar;
	}
	public int getAppearCount() {
		return appearCount;
	}
	public void setAppearCount(int appearCount) {
		this.appearCount = appearCount;
	}
}


Main所在Class定义两个私有方法:

	private static boolean LookupList(List<MaxCount> cList, char c) {
		boolean flag = false;
		String $c = String.valueOf(c);

		MaxCount maxCount = null;

		for (int i = 0; i < cList.size(); i++) {
			maxCount = cList.get(i);
			if ($c.equals(maxCount.getAppearChar())) {
				flag = true;
				maxCount = null;
				break;
			} else {
				maxCount = null;
				continue;
			}
		}
		return flag;
	}

	private static void getMaxCountByBean(String s) {
		if (null != s && !"".equals(s)) {
			@SuppressWarnings("unused")
			List<MaxCount> cList = new ArrayList<MaxCount>();
			String maxAppearString = "";
			int maxAppearCount = 0;
			char[] sCh = s.toCharArray();

			for (char c : sCh) {
				if ((c >= 65 && c <= 90) || (c >= 97 && c <= 122)) {
					if (LookupList(cList, c)) {
						for (int i = 0; i < cList.size(); i++) {
							MaxCount maxCount = cList.get(i);
							String $c = String.valueOf(c);
							if ($c.equals(maxCount.getAppearChar())) {
								cList.get(i).setAppearCount(
										maxCount.getAppearCount() + 1);
							}
						}
					} else {
						MaxCount mc = new MaxCount();
						mc.setAppearChar(String.valueOf(c));
						mc.setAppearCount(1);
						cList.add(mc);
					}
				}
			}

			for (MaxCount maxCount : cList) {
				if (maxCount.getAppearCount() > maxAppearCount) {
					maxAppearString = maxCount.getAppearChar();
					maxAppearCount = maxCount.getAppearCount();
				}
			}

			System.out.println("出现次数最多的字符为:" + maxAppearString);
			System.out.println("该字符出现的次数为:" + maxAppearCount);
		}
	}


然后在main函数中调用就可以了:
public static void main(String[] args) throws Exception{
         getMaxCountByBean("UUBSfsdgdqweqweasdasdgfdacxzasddddeqwewqeq");
}


貌似我把简单的问题搞得很复杂了,但这确实是我第一眼看到的看到这个题目时的思路,可能是做Web应用做太多的原因吧,思维被格式化了  
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics