面試 Q&A (一)

Jinx19發表於2018-08-09

看電影,儘量看多的電影

[start,end],start 電影開始的時間,end 電影結束的時間

面試 Q&A (一)

public class Movice {
    public int start;
    public int end;
    public Movice(int start,int end){
        this.start = start;
        this.end = end;
    }
    public boolean isIn(int o){
        if(o < end && o > start){
            return true;
        }
        return false;
    }
}
複製程式碼
public class FindMaxMovices {
    public int findMaxMovices(ArrayList<Movice> movices){
        Comparator<Movice> comparator = new Comparator<Movice>() {
            @Override
            public int compare(Movice o1, Movice o2) {
                return o1.end - o2.end;
            }
        };
        int count = 0;
        Collections.sort(movices,comparator);
        for (int i = 0 ; i < movices.size();i++){
            count++;
            int end = movices.get(i).end;
            for(int j = i + 1; j < movices.size(); j++){
               if(movices.get(j).isIn(end)){
                    i = j;
               }
            }
        }
        return count;
    }

    public static void main(String[] args) {
        FindMaxMovices findMaxMovices = new FindMaxMovices();
        int[][] movice = {{1,3},{2,4},{4,7},{5,6},{6,10},{3,9}};
        ArrayList<Movice> movices = new ArrayList<>();
        for(int i = 0 ; i < movice.length; i++){
            movices.add(new Movice(movice[i][0],movice[i][1]));
        }
        System.out.println(findMaxMovices.findMaxMovices(movices));
    }
}
複製程式碼

找到二叉樹兩個節點的最長距離

程式設計之美原題

解法一:

對於任意一個節點,以該節點為根,假設這個根有K個孩子節點,那麼相距最遠的兩個節點U和V之間的路徑與這個根節點的關係有兩種情況: 1.若路徑經過根Root,則U和V是屬於不同子樹的,且它們都是該子樹中到根節點最遠的節點,否則跟它們的距離最遠相矛盾。 2.如果路徑不經過Root,那麼它們一定屬於根的K個子樹之一。並且它們也是該子樹中相距最遠的兩個頂點。

因此,問題就可以轉化為在子樹上的解,從而能夠利用動態規劃來解決。 設第K棵子樹中相距最遠的兩個節點:Uk和Vk,其距離定義為d(Uk,Vk),那麼節點Uk或Vk即為子樹K到根節點Rk距離最長的節點。不失一般性,我們設Uk為子樹K中到根節點Rk距離最長的節點,其到根節點的距離定義為d(Uk,R)。取d(Ui,R)(1≤i≤k)中最大的兩個值max1和max2,那麼經過根節點R的最長路徑為max1+max2+2,所以樹R中相距最遠的兩個點的距離為:max{d(U1,V1),…,d(Uk,Vk),max1+max2+2}。 只需要遍歷所有的節點一次,時間複雜度為O(|E|)=O(|V|-1),其中V為點的集合,E為邊的集合。

package tree;
/**
 * Created by mac on 2018/7/10.
 */
public class FindMaxLen {
    int nMaxLen = 0;

    //尋找樹中最長的兩段距離
    void FindMaxLen(Node pRoot){
        if(pRoot == null){
            return;
        }

        //如果左子樹為空,那麼該節點的左邊最長距離為0
        if(pRoot.pLeft == null){
            pRoot.nMaxLeft = 0;
        }
        //如果右子樹為空,那麼該節點的右邊最長距離為0
        if(pRoot.pRight == null){
            pRoot.nMaxRight = 0;
        }
        //如果左子樹不為空,遞迴尋找左子樹最長距離
        if(pRoot.pLeft != null){
            FindMaxLen(pRoot.pLeft);
        }
        //如果右子樹不為空,遞迴尋找右子樹最長距離
        if(pRoot.pRight != null){
            FindMaxLen(pRoot.pRight);
        }
        //計算左子樹最長節點距離
        if(pRoot.pLeft != null){
            int nTempMax = 0;
            if(pRoot.pLeft.nMaxLeft > pRoot.pLeft.nMaxRight){
                nTempMax = pRoot.pLeft.nMaxLeft;
            }else{
                nTempMax = pRoot.pLeft.nMaxRight;
            }
            pRoot.nMaxLeft = nTempMax + 1;
        }

        //計算右子樹最長節點距離
        if(pRoot.pRight != null){
            int nTempMax = 0;
            if(pRoot.pRight.nMaxLeft > pRoot.pRight.nMaxRight){
                nTempMax = pRoot.pRight.nMaxLeft;
            }else{
                nTempMax = pRoot.pRight.nMaxRight;
            }
            pRoot.nMaxRight = nTempMax + 1;
        }

        if(pRoot.nMaxLeft + pRoot.nMaxRight > nMaxLen){
            nMaxLen = pRoot.nMaxLeft + pRoot.nMaxRight;
        }
    }
}
複製程式碼

改變兩個數字,a,b,不用額外的空間

a = a + b;
b = a - b;
a = a - b;
複製程式碼

用hashmap,arraylist實現set,實現方法insert,delete,getrandom 複雜度O(1)

leetcode原題 Insert Delete GetRandom O(1)

兩個hashmap

class RandomizedSet {
    
    HashMap<Integer, Integer> map1;
    HashMap<Integer, Integer> map2;
    Random rand;
 
    /** Initialize your data structure here. */
    public RandomizedSet() {
        map1  = new HashMap<Integer, Integer>();
        map2  = new HashMap<Integer, Integer>();
        rand = new Random(System.currentTimeMillis());
    }
    
    /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
    public boolean insert(int val) {
         if(map1.containsKey(val)){
            return false;
        }else{
            map1.put(val, map1.size());
            map2.put(map2.size(), val);
        }
        return true;
    }
    
    /** Removes a value from the set. Returns true if the set contained the specified element. */
    public boolean remove(int val) {
        if(map1.containsKey(val)){
            int index = map1.get(val);
 
            //remove the entry from both maps
            map1.remove(val);
            map2.remove(index);
 
            if(map1.size()==0){
                return true;
            }
 
            //if last is deleted, do nothing 
            if(index==map1.size()){
                return true;
            }    
 
            //update the last element's index     
            int key1 = map2.get(map2.size());
 
            map1.put(key1, index);
            map2.remove(map2.size());
            map2.put(index, key1);
 
        }else{
            return false;
        }
 
        return true;
    }
    
    /** Get a random element from the set. */
    public int getRandom() {
        if(map1.size()==0){
            return -1; 
        }
 
        if(map1.size()==1){
            return map2.get(0);    
        }    
 
        return map2.get(new Random().nextInt(map1.size()));
        //return 0;
    }
}

/**
 * Your RandomizedSet object will be instantiated and called as such:
 * RandomizedSet obj = new RandomizedSet();
 * boolean param_1 = obj.insert(val);
 * boolean param_2 = obj.remove(val);
 * int param_3 = obj.getRandom();
 */
複製程式碼

//一個hashmap 一個 arraylist

class RandomizedSet {
    Map<Integer, Integer> map;
    List<Integer> list;
    Random random;
    /** Initialize your data structure here. */
    public RandomizedSet() {
        map = new HashMap<>();
        random = new Random();
        list = new ArrayList<>();
    }
    
    /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
    public boolean insert(int val) {
        if (!map.containsKey(val)) {
            map.put(val, list.size());
            list.add(val);
            return true;
        }
        return false;
    }
    
    /** Removes a value from the set. Returns true if the set contained the specified element. */
    public boolean remove(int val) {
        if (!map.containsKey(val)) return false;
        int index = map.get(val);
        if (index < list.size() - 1) {
            int num = list.get(list.size() - 1);
            list.set(index, num);
            map.put(num, index);
        }
        map.remove(val);
        list.remove(list.size() - 1);
        return true;
    }
    
    /** Get a random element from the set. */
    public int getRandom() {
        return list.get(random.nextInt(list.size()));
    }
}

/**
 * Your RandomizedSet object will be instantiated and called as such:
 * RandomizedSet obj = new RandomizedSet();
 * boolean param_1 = obj.insert(val);
 * boolean param_2 = obj.remove(val);
 * int param_3 = obj.getRandom();
 */
複製程式碼

java 和 javascript的比較

由Netscape,Inc。開發的JavaScript程式語言不是Java平臺的一部分。

JavaScript不會建立applet或獨立應用程式。 在最常見的形式中,JavaScript駐留在HTML文件中,並且可以為使用簡單HTML無法實現的網頁提供互動級別。

Java和JavaScript之間的主要區別:

  • Java是一種OOP程式語言,而Java Script是一種OOP指令碼語言。
  • Java建立在虛擬機器或瀏覽器中執行的應用程式,而JavaScript程式碼僅在瀏覽器上執行。
  • 需要編譯Java程式碼,而JavaScript程式碼全部都是文字。
  • 它們需要不同的外掛。

javascript的4個特性

1.瀏覽器支援 要訪問Flash內容,您需要在瀏覽器中安裝Flash外掛。但是要使用javascript,您根本不必使用任何外掛。這是因為所有瀏覽器都接受了javascript作為它們的指令碼語言,併為它提供了整合支援。您需要做的就是正確處理一些依賴於不同瀏覽器的DOM(文件物件模型)的任務。

2.可以在客戶端和伺服器端使用 由於javascript可以訪問瀏覽器的Document物件模型,因此您可以在執行時實際更改Web頁面的結構。因此,javascript可用於為網頁新增不同的效果。另一方面,javascript也可以在伺服器端使用。例如,在Alfresco這是一個流行的開源企業內容管理系統,javascript用於建立webscripts。這使得向露天新增自定義任務變得非常簡單。

3.函數語言程式設計語言 在javascript中,函式可以像任何其他資料型別一樣分配給變數。不僅如此,函式還可以接受另一個函式作為引數,也可以返回一個函式。你也可以擁有沒有名字的功能。顯然,這使您能夠以函數語言程式設計風格進行編碼。

4.支援物件 Javascript是一種物件導向的語言。但是,javascript處理物件和繼承的方式與傳統的物件導向程式語言(如Java)略有不同。因此,javascript支援大多數物件導向的概念,同時易於學習和使用。

這些功能使javascript能夠處理簡單和複雜的任務。因此,javascript一直是最流行的程式語言。對於想要學習計算機程式設計的人來說,它也是一門很好的語言,因為它支援物件導向以及功能概念並使用它,你只需要一個瀏覽器和一個文字編輯器。

相關文章