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

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 map = new HashMap();
        List list = new ArrayList();//存储每个不重复的单词

        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=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 map = new HashMap();
	   //循环字符串中的字符
	   for(int i=0;i 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;inum)
            {
                   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类型没有定义*操作  
        }  
        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

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我"));  
    }  

11.将两个从大到小的数组,合并成一个从大到小的数组

import java.util.Arrays;

public class MergeArray {
    public static void main(String[] args) {
        int[] num1 = new int[]{188,123,23,11,4};
        int[] num2 = new int[]{22,11,9,7,3};
        //变量用于存储两个集合应该被比较的索引(存入新集合就加一)
        int a = 0;
        int b = 0;
        int[] num3 = new int[num1.length + num2.length];
        for (int i = 0; i < num3.length; i++) {
            if (a < num1.length && b < num2.length) {   //两数组都未遍历完,相互比较后加入
                if (num1[a] > num2[b]) {
                    num3[i] = num1[a];
                    a++;
                } else {
                    num3[i] = num2[b];
                    b++;
                }
            } else if (a < num1.length) {   //num2已经遍历完,无需比较,直接将剩余num1加入
                num3[i] = num1[a];
                a++;
            } else if (b < num2.length) {    //num1已经遍历完,无需比较,直接将剩余num2加入
                num3[i] = num2[b];
                b++;
            }
        }
        System.out.println("排序后:" + Arrays.toString(num3));
    }

}

 或者:

        int[] num1 = new int[]{188,123,23,11,4};
        int[] num2 = new int[]{22,11,9,7,3};
        int [] num3 = new int[num1.length + num2.length];

        int i=0 ,j=0,k=0;
        while(i< num1.length && j=num2[j]){
                num3[k++]=num1[i++];
            }else {
                num3[k++]=num2[j++];
            }
        }

        while (i

12.将一个数组指定下标的值翻转,比如[1,2,3,4,5,6],start=1,end=4,则翻转结果是[1,5,4,3,2,6

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int []arr = new int[]{1,2,3,4,5,6};
        reverse(arr,1,4);
        System.out.println(Arrays.toString(arr));

    }

    public static void reverse(int[] array,int begin, int end)
    {
        while (end > begin)
        {
            int temp = array[begin];
            array[begin] = array[end];
            array[end] = temp;
            begin++;
            end--;
        }
    }
}

13.实现单链表的翻转【挺多公司喜欢考】

public class SingleLinkedTest {
    public static void main(String[] args) {
        Node head = new Node(0);
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        head.setNext(node1);
        node1.setNext(node2);
        node2.setNext(node3);

        // 打印反转前的链表
        Node h = head;
        while (null != h) {
            System.out.print(h.getData() + " ");
            h = h.getNext();
        }
        // 调用反转方法
        head = Reverse2(head);

        System.out.println("\n**************************");
        // 打印反转后的结果
        while (null != head) {
            System.out.print(head.getData() + " ");
            head = head.getNext();
        }
    }

    /**
     * 递归,在反转当前节点之前先反转后续节点
     */
    public static Node Reverse1(Node head) {
        // head看作是前一结点,head.getNext()是当前结点,reHead是反转后新链表的头结点
        if (head == null || head.getNext() == null) {
            return head;// 若为空链或者当前结点在尾结点,则直接还回
        }
        Node reHead = Reverse1(head.getNext());// 先反转后续节点head.getNext()
        head.getNext().setNext(head);// 将当前结点的指针域指向前一结点
        head.setNext(null);// 前一结点的指针域令为null;
        return reHead;// 反转后新链表的头结点
    }


    /**
     * 利用临时变量
     */

    public static Node Reverse2(Node head){
        if (head == null || head.getNext() == null) {
            return head;// 若为空链或者当前结点在尾结点,则直接还回
        }
        Node newHead = null;
        Node node = head.getNext();
        while(node != null){
            Node temp = node;
            node = newHead;
            newHead = head;
            head = temp;
        }
        return newHead;
    }
}

class Node {
    private int Data;// 数据域
    private Node Next;// 指针域

    public Node(int Data) {
        // super();
        this.Data = Data;
    }

    public int getData() {
        return Data;
    }

    public void setData(int Data) {
        this.Data = Data;
    }

    public Node getNext() {
        return Next;
    }

    public void setNext(Node Next) {
        this.Next = Next;
    }
}

14.java多线程---顺序打印ABC的三种实现---join方法

package com.shb.test;
 
public class JoinTest {
    public static void main(String[] args) {
		ThreadA threadA = new ThreadA();
		ThreadB threadB = new ThreadB(threadA);
		ThreadC threadC = new ThreadC(threadB);
		threadA.start();
		threadB.start();
		threadC.start();
    }
}
 
class ThreadA extends Thread{
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("A");
	}
	
}
class ThreadB extends Thread{
	 private ThreadA threadA;
	   public ThreadB(ThreadA threadA){
		   this.threadA =threadA;
	   }
		@Override
		public void run() {
			// TODO Auto-generated method stub
			try {
				threadA.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("B");
		}
		
	}
class ThreadC extends Thread{
	   private ThreadB threadB;
	   public ThreadC(ThreadB threadB){
		   this.threadB =threadB;
	   }
		@Override
		public void run() {
			// TODO Auto-generated method stub
			try {
				threadB.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("C");
		}
}

15.给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1

示例:

s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
package linklist;

import java.util.HashMap;
import java.util.LinkedHashMap;

public class StringTestCount {

    public static void main(String[] args) {
        String str = "sttetssgh";
        int index = getCharIndex(str);
        System.out.println(index);
    }
    public static int getCharIndex(String str){
        HashMap map = new HashMap<>();
        int len = str.length();
        for (int i= 0; i

 

你可能感兴趣的:(面试)