论坛首页 Java企业应用论坛

面试题目

浏览 32842 次
锁定老帖子 主题:面试题目
精华帖 (0) :: 良好帖 (0) :: 新手帖 (16) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-28  
最近面试时碰到一道需要上机的题目要我用手写出来。我当时没做出来。回家后就自己写了下。可能不是最好的,但还是我自己做出来的欢迎拍砖
题目很简单:给你一个字符串,包含了空格等标点符号,要你计算出出现次数最多的字母和该字母出现的次数。
下面是我的方法

package demo;

import java.util.*;

import com.sun.org.apache.bcel.internal.generic.NEW;
public class TestClass {

	/**
	 * @param args
	 */
	//去重复字母Map
	private static Map<String, String> chMap = new HashMap<String, String>();
	//对每个字母个数进行保存Map,后面的value可以不用List改成其他类型更好(Integer)
	private static Map<String, List> countMap = new HashMap<String, List>();	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str = "hello wolrd wlllkdsfhksadfls?sdfls sdf.pqyutgvAAAxzsdfs lsdfj,ljsfd  ajfdsak sfksjdfisfsdkfj lsdfjsidf jsafdalsjfs sfskdfjs";		
		
		getChar(str);
		
		int chMpSize = chMap.size();		
		int countMapSize = countMap.size();		
		System.out.println("chMpSize: " + chMpSize );
		System.out.println("countMapSize: " + countMapSize );		

		System.out.println("===================开始=======================");
		String [] sArray = str.split("");
		List l = new ArrayList();		
		
		List  countArray = new ArrayList();
		for(int i=0;i<sArray.length;i++){
			//System.out.println(i + " " + sArray[i]);
			//int flag = 0;
			if(!sArray[i].equals("") && !sArray[i].equals(" ")
					  && !l.contains(sArray[i]) && !sArray[i].equals(",")
					  &&!sArray[i].equals(".") && !sArray[i].equals("!")
					  &&!sArray[i].equals("?")){
				//l.add(sArray[i]);				
				int num = countMap.get(sArray[i]).size();		
				countArray.add(num);
			
			}
		}
		
		//排序默认是升序
		Arrays.sort(countArray.toArray());
		Collections.reverse(countArray);
		//System.out.println(countArray.get(0));
		int max = Integer.parseInt(countArray.get(0)+"");
		//System.out.println("tt" + sArray.length);
		
		for(int i=0;i<sArray.length;i++){		
			if(!sArray[i].equals("") && !sArray[i].equals(" ")&& !l.contains(sArray[i])
					&& !sArray[i].equals(",") &&!sArray[i].equals(".") && !sArray[i].equals("!")
					  &&!sArray[i].equals("?")){
				l.add(sArray[i]);				
				int num = countMap.get(sArray[i]).size();	
				System.out.println("字母为: " + sArray[i] + "  次数:  " + num);
				if(countArray != null && countArray.size()!=0 && max == num){
					System.out.println("字母为: " + sArray[i] + "  最大次数  " + num);
				}
				
			}
		}
		
	
		
	}

	public static void getChar(String str){		
		//去掉空格
		String[] s = str.split(" ");		
		char [] c = null;		
		if (s != null){
			for(int i=0;i<s.length;i++){
				c = s[i].toCharArray();				
				getChar(c);
			}
		}
		
	}
	
	public static void getChar(char [] ch){
		
		if(ch != null && ch.length>0){
			for(int i=0;i<ch.length;i++){
				List list = new ArrayList();
				
				String  tmp = ch[i]+"";
				if(!tmp.equals(",") && !tmp.equals("!") 
					   && !tmp.equals("?") && !tmp.equals(".")){				
					//第一次
					if(!chMap.containsKey(ch[i]+"")){
						chMap.put(ch[i]+"", ch[i]+"");
						list.add(ch[i]);
						if(!countMap.containsKey(ch[i]+"")){
							countMap.put(""+ch[i], list);
						}
					}else{					
					    list = countMap.get(""+ch[i]);
					    list.add(ch[i]);			
						countMap.put(""+ch[i], list);			
					}
				}
			}
			
			
		}//end if	
		
	}
}


这里有几个地方需要修改 我没有做修改 估计会出现内存溢出的问题
   发表时间:2009-07-28  
楼上实现的过于复杂了,贴一段我的实现,请各位拍砖:
public static void main(String[] args) {	
		Map<String,Long> charTimesMap = new HashMap<String,Long>();
		
		String str = "hello wolrd wlllkdsfhksadfls?sdfls sdf.pqyutgvAAAxzsdfs lsdfj,ljsfd  ajfdsak sfksjdfisfsdkfj lsdfjsidf jsafdalsjfs sfskdfjs"; 
		for (char each : str.toCharArray()) {
			if ((each >= 65 && each <= 90) || (each >= 97 && each <= 122)) {
				String charStr = String.valueOf(each);
				if (charTimesMap.containsKey(charStr)) {
					Long num = charTimesMap.get(charStr).longValue() + 1;
					charTimesMap.put(charStr, num);
				} else {
					charTimesMap.put(charStr, 1L);
				}
			}
		}
		
		String maxAppearChar = null;
		Long maxAppearTimes = 0L;
		for (Map.Entry<String, Long> charAppear : charTimesMap.entrySet()) {
			if (charAppear.getValue() > maxAppearTimes) {
				maxAppearChar = charAppear.getKey();
				maxAppearTimes = charAppear.getValue();
			}
		}
		System.out.println("出现最多的字母:"+maxAppearChar);
		System.out.println("出现次数:"+maxAppearTimes);
	}
0 请登录后投票
   发表时间:2009-07-28  
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);
}


>_<
0 请登录后投票
   发表时间:2009-07-28  
这个在commons long 的包里面,有那个可以统计重复数量的set。直接用就可以了。
0 请登录后投票
   发表时间:2009-07-28   最后修改:2009-07-28
public class Test {
	
	public static void main(String[] args) {
		
		String str=" aaaaBBBBBBcdeFFFFFFFF           ";
		int len=str.length();
		char[] tmp=str.toCharArray();		
		
		int maxcount=0;
		char maxchar=0;
		int tempcount;		
		for(int i=0;i<len;i++){				
			tempcount=0;
			for(int j=0;j<len;j++){
				if(tmp[j]==tmp[i]) tempcount++;
			}
			if(tempcount>maxcount&&Character.isLetter(tmp[i])){
				maxcount=tempcount;
				maxchar=tmp[i];
			}			
		}
		System.out.println(maxchar);
		System.out.println(maxcount);		
	}
}


0 请登录后投票
   发表时间:2009-07-29  

public static void main(String[] args)
	{
		String str="qiwerpis;lkzxnc;v";
		Map map = new HashMap();
		for(int i=0;i<str.length();i++)
		{
			Integer count = 0;
			if(!map.containsKey(str.charAt(i)))
			{
				
				map.put(str.charAt(i), 1);
			}
			else
			{
				count = (Integer)map.get(str.charAt(i));
				count++;
				map.remove(str.charAt(i));
				map.put(str.charAt(i),count);
			}
		}
		Set set =map.keySet();
		Collection coll = map.values();
		Iterator it = coll.iterator();
		Iterator its = set.iterator();
		while(it.hasNext())
		{
			System.out.println(its.next()+" :"+it.next());
		}
	}
0 请登录后投票
   发表时间:2009-07-29  
keyboardsun 写道
这个在commons long 的包里面,有那个可以统计重复数量的set。直接用就可以了。

这个我还真没用过,有空看看
0 请登录后投票
   发表时间:2009-07-29  
这是考算法还是OO编程还是jdk?
0 请登录后投票
   发表时间:2009-07-29  
char GetLetter(char *str,int&count)
{
     if(str==null)return -1;
     int sum[26*2+6]={0};
     count=0;
     retChar=-1;
    
     for(char *p=str;*p!='/0';p++)
     {   
         char c=*p;
         if((c>= 65 &&c <= 90) || (c>= 97 && c<= 122))
               sum[c-65]++;
      }
      for(int i=0;i<26*2+6;i++)
      {
         if(sum[i]<count)continue;
         count=sum[i];
         retChar=i;
      }
      return retChar+65;

}
0 请登录后投票
   发表时间:2009-07-29  
用过一个 Map 就可以了

key就放那个 字符(把整个String按字符拆了)

value放出现次数
便利那个String拆分的数组
if(map.contions(a)){
   map.put(a,map.get(a)+1);
}
else{
   map.put(a,1);
}

组后根据要求遍历map即可
0 请登录后投票
论坛首页 Java企业应用版

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