常見機試題分析Java版

1. 操做系統任務分爲系統任務和用戶任務兩種。其中,系統任務的優先級<50,用戶任務的優先級>=50<=255.優先級大於255的爲非法任務,應予以剔除。現有一任務隊列task[],長度爲ntask中的元素值表示任務的優先級,數值越小,優先級越高。函數scheduler實現以下功能,將task[]種的任務按照系統任務、用戶任務依次存放到system_task[]數組和user_task[]數組中,數組中元素的值是任務在task[]數組中的下標,而且優先級高的任務排在前面,優先級相同的任務按照入隊順序排列,數組元素爲-1表示結束。例如:task[]={0,30,155,1,80,300,170,40,99} system_task[]=}0,3,1,7,-1} user_task[]={4,8,2,6,-1}。函數接口爲void scheduler(int task[],int n,int system_task[],int user_task[])java

思路分析:數組

(1)先看給定的函數接口,參數爲任務隊列數組、任務數、系統任務數組和用戶隊列數組,也就是說在main函數中調用該函數時,這些參數是已經初始化了的。這裏系統任務數組和用戶隊列數組就要注意了,題目中說數組元素爲-1表示結束,即數組中並非全部元素都是任務下標,輸出時用一個while循環判斷一下不是-1就成。那就好辦了,先按照任務數組的長度初始化系統任務數組和用戶隊列數組,Java會自動爲它們賦初值爲0,這樣就能夠傳參了。函數

(2)題目的核心是根據數組元素值的大小排列其下標,艾瑪這不就是爲HashMap量身定製的麼。能夠遍歷任務隊列,將系統任務和用戶任務及其下標分別存入HashMap,而後對這兩個HashMap分別按照值排序,再取出其鍵分別存入系統任務數組和用戶任務數組,最後兩個數組都添個-1就搞定了。spa

代碼以下:操作系統

 
package cn.edu.xidian.crytoll;

import java.util.*;

import java.util.Map.*;

public class Scheduler {

   public static void scheduler(int task[],int n,int system_task[],int user_task[]){

   Map<Integer,Integer> inputsystem = new HashMap<Integer,Integer>();

   Map<Integer,Integer> inputuser = new HashMap<Integer,Integer>();

   for(int i=0;i<n;i++){

   if(task[i]>=0&&task[i]<50) inputsystem.put(i,task[i]);

   else if(task[i]>=50&&task[i]<=255) inputuser.put(i,task[i]);

   }

   Map<Integer, Integer> outputsystem = sortByValue(inputsystem);

   Map<Integer, Integer> outputuser = sortByValue(inputuser);

   Set<Integer> systemset = outputsystem.keySet();

   Set<Integer> userset = outputuser.keySet(); 

   int systemn=0;

   int usern=0;

   for (Integer s:systemset) {

       system_task[systemn]=s;

       systemn++;

   } 

   for (Integer s:userset) {

       user_task[usern]=s;

       usern++;

   }

   system_task[systemn]=-1;

   user_task[usern]=-1;

   int i=0;

   while(system_task[i]!=-1){

   System.out.println(system_task[i]);

   ++i;

   }

   int j=0;

   while(user_task[j]!=-1){

   System.out.println(user_task[j]);

   ++j;

   }

   }

   public static <K, V extends Comparable<V>> Map<K, V> sortByValue(

           Map<K, V> map) {

       List<Entry<K, V>> list = new LinkedList<Entry<K, V>>(map.entrySet());

       Collections.sort(list, new Comparator<Entry<K, V>>() {

           public int compare(Entry<K, V> o1, Entry<K, V> o2) {

               Comparable<V> v1 = o1.getValue();

               V v2 = o2.getValue();

               if (v1 == null) {

                   if (v2 == null) {

                       return 0;

                   } else {

                       return -1;

                   }

               } else {

                   if (v2 == null) {

                       return 1;

                   } else {

                       return v1.compareTo(v2);

                   }

               }

           }

       });

       Map<K, V> result = new LinkedHashMap<K, V>();

       Iterator<Entry<K, V>> it = list.iterator();

       while (it.hasNext()) {

           Entry<K, V> entry = it.next();

           result.put(entry.getKey(), entry.getValue());

       }

       return result;

   }

   public static void main(String[] args){

   int task[]={0,30,155,1,80,300,170,40,99};

   int n=task.length;        

   int system_task[]=new int[n];

   int user_task[]=new int[n];

   scheduler(task,n,system_task,user_task);

   }

}                                               
 

2. 輸入一個表達式,沒有括號,數字小於0-9之間,輸出計算結果,全部的中間結果化爲整形。例如:  輸入:3+8×2/9-2。輸出:code

思路分析:blog

(1)輸入的表達式是個字符串類型,要獲取它的每一個運算數和運算符須要用到charAt()方法。而後挨個字符地存入ArrayList,再使用get()方法遍歷字符串。排序

(2)四則表達式的運算符分兩種優先級,需遍歷兩次,第一次處理乘法和除法,第二次處理加法和減法。遇到運算符後將其先後兩個數的運算結果求出,而後使用add()方法將運算結果插入到前運算數的位置,再連續使用remove()方法將參與這次運算的運算符和兩個運算數移除。最後ArrayList中只剩一個元素,即爲該表達式的值。使用parseInt()方法將其格式化後返回。接口

代碼以下:隊列

package cn.edu.xidian.crytoll;

import java.util.ArrayList;
import java.util.List;

public class getMyRet {
    public int getMyRet(String str){
        int len=str.length(); 
        List<String> list=new ArrayList<String>(); 
        for(int i=0;i<len;i++) 
            list.add(str.charAt(i)+"");
        for(int j=0;j<list.size();j++){                
            if(list.get(j).equals("×")){                    
                int ji=Integer.parseInt(list.get(j-1))*Integer.parseInt(list.get(j+1)); 
                list.add(j-1,ji+""); 
                list.remove(j); 
                list.remove(j); 
                list.remove(j);                
                j--; 
             } 
             else if(list.get(j).equals("/")){ 
                 int shang=Integer.parseInt(list.get(j-1))/Integer.parseInt(list.get(j+1)); 
                 list.add(j-1,shang+"");  
                 list.remove(j);  
                 list.remove(j);  
                 list.remove(j);  
                 j--; 
             } 
         }            
         for(int k=0;k<list.size();k++){ 
             if(list.get(k).equals("+")){ 
                 int he=Integer.parseInt(list.get(k-1))+Integer.parseInt(list.get(k+1)); 
                 list.add(k-1,he+"");  
                 list.remove(k);  
                 list.remove(k);  
                 list.remove(k);
                 k--;  
             } 
             if(list.get(k).equals("-")){ 
                 int cha=Integer.parseInt(list.get(k-1))-Integer.parseInt(list.get(k+1)); 
                 list.add(k-1,cha+"");  
                 list.remove(k);  
                 list.remove(k);  
                 list.remove(k);  
                 k--; 
             } 
         } 
         int sum=Integer.parseInt(list.get(0)); 
         return sum;
    }
    public static void main(String[] args){
        String input="3+8×2/9-2";
        getMyRet getmyret=new getMyRet();
        System.out.println(getmyret.getMyRet(input));
    }
}

 3. 將一個十進制(byte型)轉換爲二進制,將二進制數先後顛倒,再算出顛倒後對應的十進制數。

思路分析:進制互轉的話Java有現成的方法能夠調用。十進制轉二進制用Integer類的toBinaryString()方法,二進制轉十進制用Integer類的valueOf()方法。

代碼以下:

package cn.edu.xidian.crytoll;

public class UpperToLower {
    //遍歷字符串中的每一個字符,若是是小寫則直接添加進結果字符串
    //如果A-U的大寫字母,將其轉換成小寫字母后加5,添加進結果字符串
    //如果V-Z的大寫字母,將其轉換成小寫字母后減21,添加進結果字符串
    public String uptolow(String input){
        String output="";
        int len=input.length();
        for(int i=0;i<len;i++){
            if((input.charAt(i)+"").matches("[a-z]")) output=output+input.charAt(i);
            if((input.charAt(i)+"").matches("[A-U]")) output=output+((char)(input.charAt(i)+5)+"").toLowerCase();
            if((input.charAt(i)+"").matches("[V-Z]")) output=output+((char)(input.charAt(i)-21)+"").toLowerCase();
        }
        return output;
    }
    public static void main(String[] args){
        String input="AbCdEfGhIjKlMnOpQrStUvWxYz";
        System.out.println(new UpperToLower().uptolow(input));
    }
}

 4. 輸入一串數字,將第一個數字做爲容量大小,從其它的數字中挑選出之和正好等於第一個數字的數字組合,若存在這樣的數字組合其和等於第一個數字的大小,則輸出1, 不然輸出0

輸入:105342(大致上是這種形式的)輸出:1

思路分析:

(1)先將輸入格式化,第一個數字拿出來做爲目標和,其他數字存入數組並升序排序

(2)創建兩個鏈表,一個用於存儲備選數字,一個用於存儲當前歸入選擇的數字

(3)將備選數字存入鏈表,爲其設置迭代器,由於是雙層循環,故需建立一個迭代器副本

(4)設置已選數字的和並初始化爲0,從第一個備選數字開始,清空已有和,比較當前數字數字與其餘每一個數字的和的狀況

(5)若第一個備選數字和目標和相等,則返回1;若第一個備選數字大於目標和,則返回0;若當前備選數字小於目標和,判斷當前備選數字和已有和相加是否等於目標和,若等於則直接返回1;若當前備選數字和已有和相加小於目標和,將當前備選數字填入已選列表,更新當前和;若當前備選數字和已有和相加大於目標和,若減去以前插入已選列表的數字正好等於目標和,則返回1;若減去以後小於目標和,則更新當前和及已選列表,跳出循環和下一個數相比;若減去以後還大於目標和,就得不斷從已選列表中剔除最新插入的數字並更新當前和,直到當前和小於或等於目標和爲止

代碼以下:

package cn.edu.xidian.crytoll;

import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class IsEqual {
    public int isequal(String input){
        //將輸入存入字符串型數組
        String[] all=input.split(",");
        //獲取第一個數字做爲目標和
        int needsum=Integer.parseInt(all[0]);
        //將備選數字存入整型數組
        int[] member=new int[all.length-1];
        for(int i=0;i<member.length;i++) member[i]=Integer.parseInt(all[i+1]);
        //對備選數字數組排序
        Arrays.sort(member);
        //創建兩個鏈表,一個存儲備選數字,一個存儲當前歸入選擇的數字
        List<Integer> list=new LinkedList<Integer>();
        List<Integer> content=new LinkedList<Integer>();
        //將備選數字存入鏈表,爲其設置迭代器,由於是雙層循環,故需建立一個迭代器副本
        for(int i=0;i<member.length;i++) list.add(member[i]);
        Iterator it=list.iterator();
        Iterator it0=it;
        //設置已選數字的和並初始化爲0
        int sum=0;
        //從第一個備選數字開始,比較每個數字與其餘每一個數字的和的狀況
        while(it.hasNext()){
            it0=it;
            sum=0;
            while(it0.hasNext()){
                int temp=(int)it0.next();
                //若第一個備選數字和目標和相等,則返回1
                if(temp==needsum) return 1;
                //若第一個備選數字大於目標和,則返回0
                    if(temp>needsum) return 0;
                    //若當前備選數字小於目標和
                    if(temp<needsum){
                        //判斷當前備選數字和已有和相加是否等於目標和,若等於則直接返回1
                        if(temp+sum==needsum) return 1;
                        //若當前備選數字和已有和相加小於目標和,將當前備選數字填入已選列表,更新當前和
                        if(temp+sum<needsum){
                            content.add(temp);
                            sum=sum+temp;
                        }
                        //若當前備選數字和已有和相加大於目標和,
                        else if(temp+sum>needsum){
                            while(content.size()>1){
                                //若減去以前插入已選列表的數字正好等於目標和,則返回1
                                if(temp+sum-content.get(content.size()-1)==needsum) return 1;
                                //若減去以後小於目標和,則更新當前和,已選列表,跳出循環和下一個數相比
                                if(temp+sum-content.get(content.size()-1)<needsum){
                                    sum=sum-content.get(content.size()-1)+temp;
                                    content.remove(content.size()-1);
                                    content.add(temp);
                                    break;
                                }
                                //若減去以後還大於目標和,就得不斷從已選列表中剔除最新插入的數字並更新當前和,直到當前和小於或等於目標和爲止
                                else if(temp+sum-content.get(content.size()-1)>needsum){
                                    sum=sum-content.get(content.size()-1);
                                    content.remove(content.size()-1);
                                }
                            }
                        }
                    }
            }
        }
        return 0;
    }
    public static void main(String[] args){
        String input="10,5,3,4,2";
        System.out.println(new IsEqual().isequal(input));
    }
}

 5. 在給定字符串中找出單詞( 單詞由大寫字母和小寫字母字符構成,其餘非字母字符視爲單詞的間隔,如空格、問號、數字等等;另外單個字母不算單詞);找到單詞後,按照長度進行降序排序,(排序時若是長度相同,則按出現的順序進行排列),而後輸出到一個新的字符串中;若是某個單詞重複出現屢次,則只輸出一次;若是整個輸入的字符串中沒有找到單詞,請輸出空串。輸出的單詞之間使用一個空格隔開,最後一個單詞後不加空格。

思路分析:

1)將單詞門存入字符串型數組

2)對inputs進行穩定的冒泡降序排序

3)將長度大於一的單詞加入結果字符串

代碼以下:

package cn.edu.xidian.crytoll;

import java.util.HashMap;
import java.util.Map;

public class MyWord {
    public String myword(String input,String output){
        int len=input.length();
        String temp="";
        //將單詞門存入字符串型數組
        for(int i=0;i<len;i++){
            if((input.charAt(i)+"").matches("[a-zA-Z]")) temp=temp+input.charAt(i);
            if(!(input.charAt(i)+"").matches("[a-zA-Z]")) temp=temp+" ";
        }
        String[] inputs=temp.split("\\s+");
        //對inputs進行穩定的冒泡降序排序
        for(int i=0;i<inputs.length-1;i++){
            for(int j=0;j<inputs.length-i-1;j++){
                if(inputs[j].length()<inputs[j+1].length()){
                    String tempstr=inputs[j];
                    inputs[j]=inputs[j+1];
                    inputs[j+1]=tempstr;
                }
            }
        }
        //將長度大於一的單詞加入結果字符串
        for(int i=0;i<inputs.length;i++){
            if(inputs[i].length()>1&&output.indexOf(inputs[i])<0) output=output+inputs[i]+" ";
        }
        return output;
    }
    public static void main(String[] args){
        String input="DING Zhongli, academician of the Chinese Academy of Sciences (CAS) and a test";
        String output="";
        System.out.println(new MyWord().myword(input, output));
    }
}
相關文章
相關標籤/搜索