CodeGym/Blog Java/Ngẫu nhiên/Các nhiệm vụ Java với một bước ngoặt: xin chào, các cuộc ...

Các nhiệm vụ Java với một bước ngoặt: xin chào, các cuộc phỏng vấn!

Xuất bản trong nhóm
Bạn thân nhất của học viên CodeGym là các tác vụ lập trình, Java và trình xác thực tác vụ. Tuy nhiên, sẽ đến lúc mọi nhà phát triển padawan phải bắt đầu đi ra khỏi lối mòn, phát minh ra các dự án nhỏ của riêng mình và chuẩn bị cho các cuộc phỏng vấn. Người ta sẽ nghĩ rằng cuộc phỏng vấn sẽ có các nhiệm vụ Java thực tế giống hệt như trong khóa học này. Và trong hầu hết các trường hợp, đó là như vậy, nhưng một số công ty thích đặt câu hỏi mẹo hoặc điều gì đó không quen thuộc. Để tránh bị bối rối trong một cuộc phỏng vấn căng thẳng, sẽ rất hữu ích nếu bạn thử tự mình giải quyết các nhiệm vụ Java tương tự ở nhà.
Các nhiệm vụ Java với một bước ngoặt: xin chào, các cuộc phỏng vấn!  - 1
Trong bài viết này, chúng ta sẽ khám phá 5 nhiệm vụ phức tạp như vậy. Chúng tôi khuyên bạn trước tiên nên đọc các điều kiện và thử tự giải quyết chúng. Và một điều nữa: đừng quên thực hiện các tác vụ Java trong khóa học này mỗi ngày!

Nhiệm vụ 1: Tạo một vòng lặp vô hạn từ đầu

Một khối mã đã được cung cấp. Thêm vào nó để làm cho vòng lặp vô hạn.
class ToInfinity {
    public static void main(String[] args) {

// Insert code here

        for (int i = start; i <= start + 1; i++) {
             /* This should be an infinite loop, but don't change anything here */
        }
    }
}
" Điều đó không khó, " bạn nói. Rất có thể bạn đã nhiều lần rơi vào trường hợp này: trong khi hoàn thành một tác vụ Java, bạn đã tạo ra một vòng lặp vô hạn và phải nghĩ cách loại bỏ nó. Chà, đây là cách khác. Đây là phần phức tạp: bạn không thể thay đổi vòng lặp hoặc điều kiện thoát của nó. Chỉ có hai lần lặp lại. Nhưng, chúng đủ để tạo ra một vòng lặp vô hạn. Có vẻ như nó chỉ nên thực thi trong hai lần lặp lại, nhưng bạn có thể biến nó thành vô hạn bằng cách sử dụng tràn. Bạn đã đoán như thế nào chưa?

Giải pháp

Do tràn, Integer.MAX_VALUElà giá trị tối đa mà một intcó thể lưu trữ trong Java. Nếu bạn đạt Integer.MAX_VALUEvà tăng giá trị này, bạn sẽ quay trở lại Integer.MIN_VALUEhoặc đúng hơn là Integergiá trị thấp nhất có thể. Như vậy, để hoàn thành tác vụ Java này, chúng ta chỉ cần gán 1 giá trị nhỏ hơn intgiá trị lớn nhất cho startbiến. Mã Java cho tác vụ này:
class ToInfinity {
    public static void main(String[] args) {
        int start = Integer.MAX_VALUE - 1;
        for (int i = start; i <= start + 1; i++) {
            // Infinite loop
            System.out.println(i); // Be sure we are in an infinite loop
        }
    }
}
Điều gì xảy ra? Chúng tôi bắt đầu với start=2147483645 (Integer.MAX_VALUE-1). Trong lần lặp tiếp theo, giá trị trở thành 2147483645, rồi 2147483646, rồi -2147483648, -2147483647..., v.v.

Nhiệm vụ 2: Tạo một bình luận thực thi

Vâng, chúng tôi ở đây! Ngay từ những bài học đầu tiên, chúng tôi đã nghe nói rằng các bình luận không được thực thi. Đó là lý do tại sao chúng được gọi là bình luận. Chúng tôi nghĩ rằng giải pháp cho nhiệm vụ này không phải lúc nào cũng rõ ràng đối với các lập trình viên Java, kể cả những người có kinh nghiệm. Tuy nhiên, có một cách phức tạp (nhưng "hợp pháp") để làm cho JVM thực thi một nhận xét. Bạn có cảm nhận được chúng ta đang đi đâu không? Thử đoán!

Giải pháp

Mã Java cho tác vụ này:
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d System.out.println("executable comment");
    }
}
Nếu chúng ta nhập mã Java này vào một IDE, đây là những gì chúng ta sẽ nhận được:
executable comment
Điều này là do trình biên dịch Java diễn giải ký tự Unicode \u000ddưới dạng một dòng mới và đọc mã của chúng tôi như sau: Mã Java cho tác vụ này, vì nó được trình biên dịch diễn giải:
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d
        System.out.println("comment executed");
    }
}

Nhiệm vụ 3: Tạo vòng lặp có tên

Đây là một thành viên khác của loạt bài có tựa đề "Các vấn đề lập trình Java thực tế cho những con bò hình cầu". Theo nghĩa là không rõ tại sao điều này thậm chí còn cần thiết: không có khả năng vòng lặp sẽ bị xúc phạm bởi thực tế là nó chưa được đặt tên. Dù sao, nó quan trọng vì một lý do khác: ngôn ngữ cho phép bạn đặt tên cho một vòng lặp.

Giải pháp

Lưu ý: những "tên" này được một số người gọi là "nhãn" và chúng không được khuyến nghị sử dụng trong thực tế. Mã Java để chứng minh một vòng lặp được đặt tên
public class NamedLoop {
    public static void main(String[] args) {
        loop1:
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (i == 3)
                    break loop1;
                System.out.println("i = " + i + " j = " + j);
            }
        }
    }
}
Đây là những gì sẽ được xuất ra nếu bạn chạy chương trình:
i = 0 j = 0
i = 0 j = 1
i = 0 j = 2
i = 0 j = 3
i = 0 j = 4
i = 1 j = 0
i = 1 j = 1
i = 1 j = 2
i = 1 j = 3
i = 1 j = 4
i = 2 j = 0
i = 2 j = 1
i = 2 j = 2
i = 2 j = 3
i = 2 j = 4
Bạn cũng có thể sử dụng từ khóa tiếp tục quay lại đầu vòng lặp đã đặt tên. Và nếu cần, bạn có thể sử dụng break(hoặc continue) trong vòng lặp lồng nhau if-elseđể forchia nhỏ một số vòng lặp bằng cách sử dụng vòng lặp if-else. Điều này sẽ giúp tránh tạo ra một số lượng lớn các cờ và kiểm tra chúng trong một if-elsecâu lệnh để xác định nên tiếp tục hay thoát khỏi vòng lặp bên trong.

Nhiệm vụ 4: Tìm một số trùng lặp trong một mảng các số nguyên

Bạn được cung cấp một mảng số nguyên (hoặc một ArrayList, nếu bạn thích) chứa mọi giá trị Integertừ 1 đến 100. Mảng có một và chỉ một phần tử trùng lặp. Làm thế nào để bạn tìm thấy nó? Một lập trình viên Java thường nhận loại nhiệm vụ này hơn ba nhiệm vụ trước đó. Bởi vì đó là về logic hơn là kiến ​​thức của bạn về sự tinh tế hiếm khi được sử dụng của ngôn ngữ. Sự thôi thúc sử dụng vũ lực không kiềm chế đầu tiên của bạn sẽ trôi qua khá nhanh khi bộ não của bạn bắt đầu hoạt động hoặc bạn nhận ra "Tôi là một lập trình viên. Tôi thông minh." Vấn đề duy nhất là trong một cuộc phỏng vấn, khi bạn đang căng thẳng, điều này có thể không xảy ra. Vì vậy, hãy suy nghĩ ngay bây giờ trước khi bạn nhìn vào giải pháp!

Đây là thuật toán

Tính tổng của tất cả các số từ 1 đến 100. Chúng tôi nghĩ bạn biết cách thực hiện việc này (ví dụ: sử dụng phương pháp nổi tiếng của Gauss). Bây giờ hãy tính tổng các phần tử trong mảng hoặc ArrayList. Và... trừ tổng đầu tiên từ tổng thứ hai. Chơi lô tô! Số kết quả là giá trị của phần tử trùng lặp. Mã Java cho tác vụ này bằng cách sử dụng tệp ArrayList.
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class FindDuplicate {
    private static void findDuplicate(List<Integer> elements) {

        int distinctSum = elements.stream().distinct().mapToInt(e -> e).sum();
// Find the sum of all list elements
        int totalSum = elements.stream().mapToInt(e -> e).sum();
        System.out.println("The repeated element is: " + (totalSum - distinctSum));
    }

    public static void main(String[] args) {
// Create a list of sequential elements in the interval [1..101).
        List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
// Add the value 23 at index 53
        elements.set(53, 23);
        findDuplicate(elements);
    }
}

Giải pháp khác

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

public class Duplicate {

    public int findDuplicateNumber(List<Integer> numbers) {

        int highestNumber = numbers.size() - 1;
        int total = getSum(numbers);
        int duplicate = total - (highestNumber * (highestNumber + 1) / 2);
        return duplicate;
    }

    public int getSum(List<Integer> numbers) {

        int sum = 0;
        for (int num : numbers) {
            sum = sum + num;
        }
        return sum;
    }

    public static void main(String a[]) {
        List <Integer> numbers = new ArrayList <Integer>();
        for (int i = 1; i < 100; i++) {
            numbers.add(i);
        }
        // Add a duplicate to the list
        numbers.add(25);
        Duplicate dn = new Duplicate();
        System.out.println("The repeated element is: " + dn.findDuplicateNumber(numbers));
    }
}

Nhiệm vụ 5: Tìm một bản sao không duy nhất trong một mảng các số nguyên

Nếu nhiệm vụ trước đó quá dễ đối với bạn, hãy thử làm điều này: Bạn được cung cấp một danh sách các số nguyên từ 1 đến 100. Có các số trùng lặp trong đó (nhiều hơn một). Làm thế nào để bạn tìm thấy các yếu tố xảy ra nhiều lần (tìm các yếu tố và cho biết chúng xảy ra bao nhiêu lần)?

Giải pháp

Ở đây, giải pháp hợp lý sẽ là sử dụng thứ gì đó giống như HashMap, vì nó lưu trữ dữ liệu theo cặp khóa-giá trị. Mã cho tác vụ này trong Java:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class SomeDuplicates {
    private static void findDuplicates(List<Integer> elements) {
        HashMap <Integer, Integer> duplicates = new HashMap <>();
// Use the following rule to populate the Map duplicates:
// the key is the element value, and the value is the number of times it occurs
        elements.forEach(e -> duplicates.put(e, duplicates.get(e) == null ? 1 : duplicates.get(e) + 1));
// Remove any elements that don't occur more than once from the Map duplicates
// and store the result as a list (to make it easy to work with in the next step)
        List <Map.Entry <Integer, Integer> >
        result = duplicates.entrySet().stream().filter(d -> d.getValue() > 1).collect(Collectors.toList());
// Write the results for all elements to the result list
        result.forEach(e -> System.out.println(String.format("Element %d  occurs %d times", e.getKey(), e.getValue())));
    }

    public static void main(String[] args) {
        List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
        elements.set(97, 23);
        elements.set(27, 51);
        elements.set(99, 23);
        findDuplicates(elements);
    }
}

Phần kết luận

Có rất nhiều loại nhiệm vụ Java thực tế khác nhau và bạn không biết người phỏng vấn sẽ yêu cầu bạn giải những loại câu đố nào. Tuy nhiên, bất kỳ nhà tuyển dụng hợp lý nào cũng hiểu rằng khả năng hoàn thành các nhiệm vụ thực tế của bạn , giống như những nhiệm vụ bạn sẽ gặp trong công việc, quan trọng hơn nhiều so với khả năng giải quyết các câu hỏi mẹo của bạn. Vì vậy, làm những điều này càng nhiều càng tốt. Đó là lý do tại sao chúng tôi tạo ra CodeGym. Tài liệu từ geeksforgeeks đã được sử dụng để tạo bài viết này.
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào