Giaosucan's blog - Chia sẻ kiến thức theo cách bá đạo

Ticker

20/recent/ticker-posts

Gái ngành coding phiêu lưu ký - part 2 - Lễ tân liệt truyện

Hồi thứ 2
Chốn công đường, Trâm tiểu thư tỏ lòng trong sạch
Nơi cầu thang, Phương lễ tân lộ mặt lọc lừa
Lại nói chuyện từ hồi 1, Trâm tiểu thư và Khá công tử bị quan binh ập vào bắt tại kĩ viện Mưa Hồng. Mặc dù đã tìm mọi cách giải thích nhưng 2 người vẫn bị bổ đầu áp giải đi giam vào ngục. 
3 ngày sau, quan phủ cho đánh trống thăng đường xét xử, truyền đưa 2 người vào. Vị quan này họ Bao tên Chửng, tự là Cao Su, nổi tiếng thanh liêm, liệu việc như thần.

Bao Cao Su đập bàn hương án hét lớn
Chốn kinh kỳ là nơi thanh lịch văn minh, há đâu để 2 ngươi bày trò chim chuột?
Khá công tử mặt không đổi sắc, quỳ xuống thưa rằng
Thảo dân chỉ là một nho sinh, vốn làm developer ở FSOFT, xưa nay chỉ lấy máy tính làm bầu bạn, viết code để giải buồn, là người học hành đến bậc cử nhân, đâu phải hạng chơi bời lãng tử mà làm trò như vậy. Rõ ràng có kẻ muốn hãm hại. Xin đại nhân minh xét
Bao Cao Su nhìn kĩ khuôn mặt của Khá công tử, thấy mặt như dồi phấn, môi tựa thoa son, tướng tá nho sinh. Còn nhìn Trâm tiểu thư, lông mày lá liễu, da trắng như tuyết, dáng vẻ yểu điệu thục nữ, rõ ràng là một tiểu thư trâm anh thế phiệt, không phải là phường kĩ nữ lăng loàn. Trong lòng cảm thấy nghi hoặc
Đang lúc suy nghĩ, thì có quan tổng quản là Xuân Hồng ghé tai nói nhỏ
Đại nhân cứ làm như vầy, như vầy…
Bao Cao Su nghe xong khen phải, liền đập bàn hét lớn
Ngươi nói là developer thì phải giỏi code, nay ta cho bài toán lập trình nếu không giải được thì trị tội.
Nay phủ ta quanh năm mưa lớn, nên bản phủ có đặt mua 1 lượng lu nước về. Một là để chống ngập lụt, hai là để phát triển nền thủ công gốm sứ nước nhà. Tuy nhiên lu nước thì size khác nhau, có cái nhỏ cái to, cũng phải quản lý cho chặt tránh bị thất thoát.
Coi như mỗi lu nước được lưu vào một array, value của phần tử là size của lu nước
Ngươi hãy viết code để sắp xếp lu từ size lớn đến bé cho ta xem
Khá công tử nghe xong ứng khẩu nói luôn
Nếu thì dùng thuật toán Bubble Sort để sắp xếp ạ. Ý tưởng như vầy
Giải sử array có 5 chiếc lu như ở dưới
 
void bubbleSort(int arrLu[])
    {
        int n = arrLu.length;
        for (int i = 0; i < n-1; i++)
            for (int j = 0; j < n-i-1; j++)
                if (arrLu[j] > arrLu[j+1])
                {
                    // swap temp and arrLu[i]
                    int temp = arrLu[j];
                    arrLu[j] = arrLu[j+1];
                    arrLu[j+1] = temp;
                }
    }



Bao Cao Su nghe xong cả giận đập hương án thét lớn
Đúng là con gà, thuật toán này người loop 2 lớp, độ phức tạp phải là O(n2). Nay số lu ngươi nói mới có 5 chiếc. Trong khi thành Thăng Long đất vuông ngàn dặm tính ra phải cả triệu cái lu. Người dùng cách này thì máy tính chạy bao giờ mới xong, có đủ memory không. Ngươi không tính đến phép tối ưu thuật toán à?
Xin đại nhân bớt giận, thật ra có nhiều thuật toán sắp xếp, có thể dùng thuật toán QuickSort sẽ tối ưu hơn
Thuật toán này có thể gọi là chia để trị như sau
Thảo dân lấy 1 phần tử bên phải gọi là pivot number (70)
Những phần tử nào nhỏ hơn 70 nhóm lại cho sang trái
Lớn hơn thì cho sang phải
Đối với nhóm bên trái và bên phải cứ lặp lại các bước như trên đến khi ko chia được nữa
quicksort
   int partition(int arrLu[], int left, int right) 
    { 
        int pivot = arrLu[right];  
        int i = (left-1); // index of smaller element 
        for (int j=left; j<right; j++) 
        { 
            // If current element is smaller than or 
            // equal to pivot 
            if (arrLu[j] <= pivot) 
            { 
                i++; 
  
                // swap arrLu[i] and arrLu[j] 
                int temp = arrLu[i]; 
                arrLu[i] = arrLu[j]; 
                arrLu[j] = temp; 
            } 
        } 
  
        // swap arrLu[i+1] and arrLu[right] (or pivot) 
        int temp = arrLu[i+1]; 
        arrLu[i+1] = arrLu[right]; 
        arrLu[right] = temp; 
  
        return i+1
    } 
  
  
    /* The main function that implements QuickSort() 
      arrLu[] --> arrLuay to be sorted, 
      left  --> Starting index, 
      right  --> Ending index */
    void sort(int arrLu[], int left, int right) 
    { 
        if (left < right) 
        { 
            /* pi is partitioning index, arrLu[pi] is  
              now at right place */
            int pi = partition(arrLu, left, right); 
  
            // Recursively sort elements before 
            // partition and after partition 
            sort(arrLu, left, pi-1); 
            sort(arrLu, pi+1, right); 
        } 
    }


Lúc này độ phức tạp chỉ còn là O(n log(n)) performance tốt hơn nhiều
Bao Cao Su nghe xong gật gù: Được
Hôm trước bản phủ có nhập về N = 10 chiếc lu kích thước từ 0 đến 9, giờ kiểm kê chỉ còn thế này
arrLu =[1, 2, 3, 4, 6, 9, 8]
Tức là ta bị mất 3 cái kích thước  0, 5, 7 🡪 Làm sao để tính ra được?
Dạ có thế này ạ
// main function
    public static void main (String[] args)
    {
        // input array contains n numbers between [1 to n - 1]
        // with one duplicate, where n = A.length
        int[] arrLu = {1, 2, 3, 4, 6, 9, 7,8};
        boolean tmpArr[] = new boolean[10];

        for (int i = 0; i < arrLu.length; i++) { 
            tmpArr[arrLu[i]]= true;          
        }   
        
        for (int i = 0; i < tmpArr.length;i++) {
            if (tmpArr[i] == false)
            System.out.println(i);
        }
    }


Bao Cao Su gật gù, nhưng thật ra không có lu nào mà lại có size = 0 cả, size bé nhất là 1 thôi. Lu của ta kích thước là 1 🡪 10
Tức là chính xác phải là 5, 7, 10 thì làm sao
Dạ có thể dùng BitSet của Java như ở dưới
  private static void findMissingLu(int[] arrLu, int count) {
        int missingCount = count - arrLu.length;
        BitSet bitSet = new BitSet(count);

        for (int number : arrLu) {
            bitSet.set(number - 1);
        }

        System.out.printf("Missing Lu in integer array %s, with total number %d is %n",
        Arrays.toString(arrLu), count);
        int lastMissingIndex = 0;

        for (int i = 0; i < missingCount; i++) {
            lastMissingIndex = bitSet.nextClearBit(lastMissingIndex);
            System.out.println(++lastMissingIndex);
        }
    }


Bao Cao Su nghe xong hết sức hài lòng vỗ đùi đánh đét
Ngươi đúng là code giỏi, rõ ràng là có kẻ ngậm máu phun người. 
Nói xong cho gọi nhân chứng vào xét hỏi. Đó là một cô nương tên Phương làm lễ tân ở quán mưa hồng. Bao Cao Su nạt lớn
Ngươi tố cáo 2 người này quan hệ mãi dâm, ngươi thấy họ ở đâu
Dạ ở cầu thang của quán
Người làm nghề lễ tân đáng ra phải đứng ở sảnh làm việc, chui ra cầu thang làm gì. Rõ ràng là điêu dân to gan.
Em Phương Lễ Tân hoảng kinh hồn vía lên mây nên mới quỳ xuống lạy thưa
Tiểu nhân lỡ dại. Hôm đó tiểu nhân ra cầu thang để quay clip. Nào ngờ Trâm Tiểu Thư có clip 9 phút mà tiểu nhân chỉ quay dc có 4 phút với 87s nên sinh lòng đố kị, nên mới bày đặt tố cáo chuyện này. Xin đại nhân tha mạng
Bao Cao Su nạt lớn
Đem ả tiên nhân này đánh 20 hèo giam vào ngục

Không biết số phận của Phương Lễ Tân thế nào xem hồi sau sẽ rõ

Đăng nhận xét

5 Nhận xét