面试中常考的算法编程题目(会持续更新......)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunhongbing1024/article/details/82964667

1.找到英文句子中出现次数最多的单词

public class Count {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();

        String str = "Look to the skies above London and you'll see the usual suspects rainclouds, plane and pigeons. But by the end of the year, you might just see something else.";
        str = str.replace('\'', ' ');//将'号用空格替换
        str = str.replace(',', ' ');//将逗号用空格替换
        str = str.replace('.', ' ');//将句号用空格替换

        String[] strings = str.split("\\s+");   // “\\s+”代表一个或多个空格,是正则表达式
//      String[] strings = str.split(" +"); // “ +”在我的机器上也能代表一个或多个空格

        Map<String, Integer> map = new HashMap<String, Integer>();
        List<String> list = new ArrayList<String>();//存储每个不重复的单词

        for(String s : strings){
            if(map.containsKey(s)){//如果map中已经包含该单词,则将其个数+1
                int x = map.get(s);
                x++;
                map.put(s, x);
            }else{  //如果map中没用包含该单词,代表该单词第一次出现,则将其放入map并将个数设置为1
                map.put(s, 1);
                list.add(s);//将其添加到list中,代表它是一个新出现的单词
            }
        }

        int max=0;//记录出现次数最多的那个单词的出现次数
        String maxString = null;//记录出现次数最多的那个单词的值
        /*
         * 从list中取出每个单词,在map中查找其出现次数
         * 并没有真正排序,而只是记录下出现次数最多的那个单词
         */
        for(String s : list){
            int x = map.get(s);
            if(x>max){
                maxString = s;
                max = x;
            }
        }

         System.out.println("字符串:"+maxString+"出现次数:"+max);

        long end = System.currentTimeMillis();

        System.out.println("共耗时:" + (end - start) + "毫秒");
    }
}

2.判断某个单词在一个句子中出现的次数,比如this在tathishahathis出现的次数

       String str1 = "tathishahathis";
	   String str2 = "this";
	   int total = 0;
	   for (String tmp = str1; tmp != null&&tmp.length()>=str2.length();){
	     if(tmp.indexOf(str2) == 0){
	       total ++;
	     }
	     tmp = tmp.substring(1);
	   }
	   System.out.println(str1+"中含有"+total+"个"+str2);

3.利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。

给定一个string iniString为待压缩的串(长度小于等于3000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。

测试样例

"aabcccccaaa"

返回:"a2b1c5a3"

"welcometonowcoderrrrr"

返回:"welcometonowcoderrrrr"

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
 * 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。
 * 比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。
 */
public class CountNumber {
 
 //定义一个方法,用于判断连续字母的个数
 public static String zipStr(String iniString){
  if(iniString == null || iniString.length()==0) {
              return null;
          }
          StringBuilder sb = new StringBuilder();
          int len = iniString.length();
          for(int i=0;i<len;i++) {
              int count = 1;
              while((i+1)<len && iniString.charAt(i) == iniString.charAt(i+1)){
                  count++;
                  i++;
              }
              if(count>=1){
                  sb.append(iniString.charAt(i));
                  sb.append(count);
              }else{
                  sb.append(iniString.charAt(i));
              }
          }
          if(sb.length() < iniString.length()){
              return sb.toString();
          }
          return iniString;
  }
   public static void main(String[] args) {
   String str="welcometonowcoderrrrr";
   String str2=CountNumber.zipStr(str);    
   System.out.println(str2);      
  }   
}

4."this is english"倒序后为hsilgne si siht

public class ReverseString {
 static String getString(String s){
  StringBuilder sb=new StringBuilder();
  for(int i=s.length()-1;i>=0;i--){
   sb.append(s.charAt(i));
  }
  return sb.toString();
 }
   public static void main(String[] args) {
 String s="this is english";
 String s1=ReverseString.getString(s);
 System.out.println(s1);
 }
}

5.输入一行字符,分别统计出其中英文字母,空格,数字和其他字符个数

public class CharCout {
   public static void main(String[] args) {
	   String sourceStr = "a bba1a+";
	 //创建一个容器,用来保存结果,英文字母空格数组和其他字符做key,个数为value
	   Map<String,Integer> map = new HashMap<String,Integer>();
	   //循环字符串中的字符
	   for(int i=0;i<sourceStr.length();i++){
	       //获取字符串第i位的字符
	       String eStr = String.valueOf(sourceStr.charAt(i));
	       //若结果集中没有这个字符,则向结果集中增加这个字符,并初始化这个字符的值为1
	       if(!map.containsKey(eStr)){
	           map.put(eStr, 1);
	       }
	       //如果结果集中已经存在这个字符,则获取这个字符并且加1更新value值
	       else{
	           map.put(eStr,map.get(eStr)+1);
	       }
	   }
	   
	   for(Map.Entry<String, Integer> entry : map.entrySet()){
		   System.out.println("字符 "+entry.getKey()+"的个数:"+entry.getValue());
	   }
   }
}

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

/**
 首先要了解中文字符有多种编码及各种编码的特征。
    假设n为要截取的字节数。
**/
 //第一种:    
 public static void main(String[] args) throws Exception{
            String str = "我a爱中华abc我爱传智def';
            String str = "我ABC汉";
            int num = trimGBK(str.getBytes("GBK"),5);
            System.out.println(str.substring(0,num) );
      }
     
      public static int  trimGBK(byte[] buf,int n){
            int num = 0;
            booleanbChineseFirstHalf = false;
            for(inti=0;i<n;i++)
            {
                  if(buf[i]<0 && !bChineseFirstHalf){
                        bChineseFirstHalf = true;
                  }else{
                        num++;
                        bChineseFirstHalf = false;                     
                  }
            }
            return num;
      }
 
//第二种:
public static void split(String source,int num)   
    {
        int k=0;
        String temp="";
        for (int i = 0; i <source.length(); i++)
        {
            byte[] b=(source.charAt(i)+"").getBytes();
            k=k+b.length;
            if(k>num)
            {
                   break;
            }
            temp=temp+source.charAt(i);
        }
            System.out.println(temp);
    }

7. 阶乘n!

import java.math.BigDecimal;  
import java.util.Scanner;  
public class Factorial1 {  
    public static BigDecimal factorial(int n){   
        BigDecimal result = new BigDecimal(1);  
        BigDecimal a;  
        for(int i = 2; i <= n; i++){  
            a = new BigDecimal(i);//将i转换为BigDecimal类型  
            result = result.multiply(a);//不用result*a,因为BigDecimal类型没有定义*操作</span><span>  
        }  
        return result;  
    }  
      
    public static void main(String[] arguments){  
        Scanner sc = new Scanner(System.in);  
        int a = sc.nextInt();//读取控制台输入的整数  
        System.out.println(a + "!=" + factorial(a));  
    }  
  
} 

8.将金额小写转换为大写(后面还有两位小数)?

public class MoneyConvert  
{  
    private final String[] str1 = {"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿"};  
    private final String[] str2 = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};  
    private final String[] str3 = {"角", "分"};         
    public static void main(String[] args)  
    {  
        double n = 1234506.789;            
        MoneyConvert mc = new MoneyConvert();  
        String str = mc.convert(n);        
        System.out.println(str);  
    }       
    public String convert(double n)  
    {  
        String str = String.valueOf(n);  
        String temp1 = str.substring(0, str.indexOf("."));  
        String temp2 = str.substring(str.indexOf(".")+1);              
        int k = -1;  
        int len = -1;  
        StringBuffer sb = new StringBuffer();              
        len = temp1.length()-1;  
        for(int i=0; i<temp1.length(); i++)  
        {  
            k = Integer.parseInt(temp1.substring(i, i+1));  
            sb.append(str2[k]).append(str1[len-i]);  
        }             
        for(int i=0; i<2; i++)  
        {  
            k = Integer.parseInt(temp2.substring(i, i+1));  
            sb.append(str2[k]).append(str3[i]);  
        }     
        return sb.toString();  
    }  
}  

9.实现遍历磁盘中的文件(会把磁盘根目录和根目录下的所有文件都遍历出来)

public void dir(File f){
     //获得当前路径下的所有文件和文件夹
      File[] allFiles = f.listFiles();
     //循环所有路径
      for(int i = 0;i < allFiles.length;i++{
           //如果是文件夹
            if(allFiles[i].isDirectory()){
              //递归调用
                dir(allFiles[i]);
           }else{ //文件
                 //执行操作,例如输出文件名
                 System.out.println(allFiles[i].getName());
             }
      }
}

10.假设字符串类似这样的aba和aab就相等,现在随便给你二组字符串,请编程比较他们看是否相等

/** 
     * 第一种方式: 
     * 实现思路:将字符串通过getBytes方法转换为byte数组,或者通过toCharArray()转换为char数组 
     * 然后先调用Arrays的sort方法进行排序,再调用Arrays的equels方法判断是否相等; 
     *  
     * @param str1 
     * @param str2 
     * @return 
     */  
    public static boolean equels(String str1, String str2) {  
        byte[] sa1 = str1.getBytes();  
        byte[] sa2 = str2.getBytes();  
        Arrays.sort(sa1);  
        Arrays.sort(sa2);  
        return Arrays.equals(sa1, sa2);  
    }  
      
    /** 
     * 第二种方式: 
     * 实现思路:将其中一个字符串放到一个StringBuffer中,然后遍历另一个String; 
     * 判断另一个String的每个字符在StringBuffer中是否存在,如果有的话,删除StringBuffer中对应的第一个字符; 
     * 遍历结束后,查看StringBuffer的长度是否为0; 
     *  
     * @param str1 
     * @param str2 
     * @return 
     */  
    public static boolean stringSame(String str1, String str2) {  
        // 先判断长度  
        if (str1.length() != str2.length()) {  
            return false;  
        }  
          
        // 把str2放到一个StringBuffer,  
        StringBuffer str2Buffer = new StringBuffer();  
        str2Buffer.append(str2);  
  
        // 循环字符串1的字符,查看字符串2是否有相同字符,有的话删除  
        for (int i = 0; i < str1.length(); i++) {  
            char temp = str1.charAt(i);  
            int index = str2Buffer.toString().indexOf(temp);  
            if (index != -1) {  
                str2Buffer.deleteCharAt(index);  
            } else {  
                return false;  
            }  
        }  
          
        // 删除结束,确认长度为0则相等  
        if (str2Buffer.toString().length() == 0) {  
            return true;  
        }  
  
        return false;  
    }  
  
    public static void main(String[] args) {  
        System.out.println(equels("aa23b235", "23ab235a"));  
        System.out.println(stringSame("aa23b2我35", "23ab235a我"));  
    }  

猜你喜欢

转载自blog.csdn.net/sunhongbing1024/article/details/82964667
今日推荐