โค้ดยิม/จาวาบล็อก/สุ่ม/งาน Java ที่พลิกผัน: สวัสดี บทสัมภาษณ์!
John Squirrels
ระดับ
San Francisco

งาน Java ที่พลิกผัน: สวัสดี บทสัมภาษณ์!

เผยแพร่ในกลุ่ม
เพื่อนที่ดีที่สุดของนักเรียน CodeGymคืองานด้านการเขียนโปรแกรม, Java และตัวตรวจสอบความถูกต้องของงาน ถึงกระนั้นก็ถึงเวลาที่นักพัฒนาพาดาวันทุกคนต้องเริ่มเดินออกนอกเส้นทางหลัก คิดค้นมินิโปรเจกต์ของตัวเอง และเตรียมตัวสำหรับการสัมภาษณ์ ใครจะคิดว่าการสัมภาษณ์จะมีงาน Java ที่ใช้งานได้จริงเหมือนกันกับที่พบในหลักสูตรนี้ และในกรณีส่วนใหญ่ก็เป็นเช่นนั้น แต่บางบริษัทชอบถามคำถามหลอกๆ หรืออะไรที่ไม่คุ้นเคย เพื่อหลีกเลี่ยงความวุ่นวายระหว่างการสัมภาษณ์ที่ตึงเครียด การลองแก้ปัญหา Java ที่คล้ายกันด้วยตัวเองที่บ้านจะเป็นประโยชน์
งาน Java ที่พลิกผัน: สวัสดี บทสัมภาษณ์!  - 1
ในบทความนี้ เราจะสำรวจ 5 งานที่ยุ่งยากเช่นนี้ เราขอแนะนำให้คุณอ่านเงื่อนไขก่อนและลองแก้ไขด้วยตนเอง และอีกอย่างหนึ่ง: อย่าลืมทำงาน Java ในหลักสูตรนี้ทุกวัน!

ภารกิจที่ 1: สร้างลูปไม่สิ้นสุดตั้งแต่เริ่มต้น

มีการจัดเตรียมบล็อกของรหัส เพิ่มเข้าไปเพื่อทำให้ลูปไม่สิ้นสุด
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 */
        }
    }
}
" นั่นไม่ใช่เรื่องยาก " คุณพูด คุณมักจะพบว่าตัวเองอยู่ในสถานการณ์นี้ซ้ำแล้วซ้ำอีก: ในขณะที่ทำงาน Java เสร็จ คุณสร้างการวนซ้ำไม่สิ้นสุดและต้องคิดถึงวิธีกำจัดมัน นี่เป็นวิธีอื่น นี่คือส่วนที่ยุ่งยาก: คุณไม่สามารถเปลี่ยนลูปหรือเงื่อนไขการออกได้ มีการทำซ้ำเพียงสองครั้งเท่านั้น แต่ก็เพียงพอที่จะสร้างลูปไม่สิ้นสุด ดูเหมือนว่าควรดำเนินการสำหรับการวนซ้ำสองครั้งเท่านั้น แต่คุณสามารถทำให้ไม่มีที่สิ้นสุดได้โดยใช้โอเวอร์โฟลว์ คุณเดาได้อย่างไร

สารละลาย

เนื่องจากโอเวอร์โฟลว์Integer.MAX_VALUEเป็นค่าสูงสุดที่intสามารถจัดเก็บใน Java หากคุณไปถึงInteger.MAX_VALUEและเพิ่มค่านี้ คุณจะย้อนกลับไปที่Integer.MIN_VALUEหรือมากกว่านั้น เป็นIntegerค่า ที่ต่ำที่สุดเท่าที่จะเป็นไปได้ ดังนั้น เพื่อให้งาน Java นี้สมบูรณ์ เราเพียงแค่กำหนดค่าให้น้อยกว่าintค่าสูงสุด 1 ค่าให้กับstartตัวแปร รหัส Java สำหรับงานนี้:
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
        }
    }
}
เกิดอะไรขึ้น? เราเริ่มต้นด้วย start=2147483645 (Integer.MAX_VALUE-1) ในการทำซ้ำครั้งต่อไป ค่าจะกลายเป็น 2147483645 จากนั้น 2147483646 จากนั้น -2147483648, -2147483647... ไปเรื่อยๆ

ภารกิจที่ 2: สร้างข้อคิดเห็นที่สามารถดำเนินการได้

เราอยู่ที่นี่แล้ว! จากบทเรียนแรกๆ เราได้ยินมาว่าความคิดเห็นจะไม่ถูกดำเนินการ นั่นเป็นเหตุผลที่พวกเขาเรียกว่าความคิดเห็น เราคิดว่าทางออกของงานนี้อาจไม่ชัดเจนเสมอไปสำหรับโปรแกรมเมอร์ Java หรือแม้แต่ผู้ที่มีประสบการณ์ อย่างไรก็ตาม มีวิธีหนึ่งที่ยุ่งยาก (แต่ "ถูกกฎหมาย") ในการทำให้ JVM ดำเนินการแสดงความคิดเห็น คุณสัมผัสได้ไหมว่าเรากำลังมุ่งหน้าไปทางไหน? ลองเดา!

สารละลาย

รหัส Java สำหรับงานนี้:
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d System.out.println("executable comment");
    }
}
หากเราป้อนโค้ด Java นี้ใน IDE สิ่งที่เราจะได้รับมีดังนี้
executable comment
นี่เป็นเพราะคอมไพเลอร์ Java ตีความอักขระ Unicode \u000dเป็นบรรทัดใหม่ และอ่านโค้ดของเราดังนี้: โค้ด Java สำหรับงานนี้ ตามที่คอมไพเลอร์ตีความ:
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d
        System.out.println("comment executed");
    }
}

ภารกิจที่ 3: สร้างลูปที่มีชื่อ

ต่อไปนี้คือสมาชิกอีกคนของซีรีส์เรื่อง "ปัญหาการเขียนโปรแกรม Java เชิงปฏิบัติสำหรับ Spherical Cows" ในแง่ที่ว่ามันไม่ชัดเจนว่าทำไมสิ่งนี้ถึงจำเป็น: ไม่น่าเป็นไปได้ที่ลูปจะถูกทำให้ขุ่นเคืองเนื่องจากไม่ได้รับชื่อ อย่างไรก็ตาม เหตุผลอื่นก็สำคัญ ภาษาช่วยให้คุณตั้งชื่อลูปได้

สารละลาย

หมายเหตุ:บางคนรู้จัก "ชื่อ" เหล่านี้ว่าเป็น "ป้ายกำกับ" และไม่แนะนำให้ใช้ในทางปฏิบัติ รหัส Java สำหรับการสาธิตการวนรอบที่มีชื่อ
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);
            }
        }
    }
}
นี่คือสิ่งที่จะแสดงผลหากคุณเรียกใช้โปรแกรม:
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
คุณยังสามารถใช้คำหลักดำเนินการต่อเพื่อกลับไปที่จุดเริ่มต้นของลูปที่มีชื่อ และถ้าจำเป็น คุณสามารถใช้break(หรือcontinue) ในลูปที่ซ้อนif-elseกันforเพื่อแบ่งลูปหลายๆ ลูปโดยใช้ไฟล์if-else. สิ่งนี้จะช่วยหลีกเลี่ยงการสร้างแฟล็กจำนวนมากและตรวจสอบในคำif-elseสั่งเพื่อพิจารณาว่าจะดำเนินการต่อหรือออกจากวงใน

ภารกิจที่ 4: ค้นหารายการที่ซ้ำกันในอาร์เรย์ของจำนวนเต็ม

คุณจะได้รับอาร์เรย์จำนวนเต็ม (หรือArrayListถ้าคุณต้องการ) ที่ประกอบด้วยทุกๆInteger1 ถึง 100 อาร์เรย์มีหนึ่งและเพียงหนึ่งองค์ประกอบที่ซ้ำกัน คุณจะหามันได้อย่างไร? เป็นเรื่องปกติที่โปรแกรมเมอร์ Java จะรับงานประเภทนี้มากกว่างานสามงานก่อนหน้านี้ เพราะมันเกี่ยวกับตรรกะมากกว่าความรู้ของคุณเกี่ยวกับรายละเอียดปลีกย่อยของภาษาที่ไม่ค่อยได้ใช้ แรงกระตุ้นแรกที่ควบคุมไม่ได้ของคุณในการใช้กำลังเดรัจฉานจะผ่านไปค่อนข้างเร็วเมื่อสมองของคุณทำงานหรือคุณตระหนักว่า "ฉันเป็นโปรแกรมเมอร์ ฉันฉลาด" ปัญหาเดียวคือในระหว่างการสัมภาษณ์ เมื่อคุณอยู่ภายใต้ความเครียด สิ่งนี้อาจไม่เกิดขึ้น ดังนั้นคิดก่อนที่จะดูวิธีแก้ปัญหา!

นี่คืออัลกอริทึม

คำนวณผลรวมของตัวเลขทั้งหมดตั้งแต่ 1 ถึง 100 เราคิดว่าคุณรู้วิธีการทำเช่นนี้ (เช่น ใช้วิธีที่มีชื่อเสียงของ Gauss) ตอนนี้คำนวณผลรวมขององค์ประกอบในอาร์เรย์ArrayListหรือ และ... ลบผลรวมแรกออกจากที่สอง บิงโก! จำนวนผลลัพธ์คือค่าขององค์ประกอบที่ซ้ำกัน รหัส Java สำหรับงานนี้โดยใช้ไฟล์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);
    }
}

อีกวิธีหนึ่ง

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

ภารกิจที่ 5: ค้นหารายการซ้ำที่ไม่ซ้ำในอาร์เรย์ของจำนวนเต็ม

หากงานก่อนหน้านี้ง่ายเกินไปสำหรับคุณ ให้ลองทำสิ่งนี้: คุณจะได้รับรายการจำนวนเต็มตั้งแต่ 1 ถึง 100 โดยมีรายการที่ซ้ำกัน (มากกว่าหนึ่งรายการ) คุณจะค้นหาองค์ประกอบที่เกิดขึ้นมากกว่าหนึ่งครั้งได้อย่างไร (ค้นหาองค์ประกอบและระบุว่าเกิดขึ้นกี่ครั้ง)

สารละลาย

วิธีแก้ปัญหาเชิงตรรกะคือการใช้บางอย่างเช่น HashMap เนื่องจากเก็บข้อมูลไว้ในคู่คีย์-ค่า รหัสสำหรับงานนี้ใน 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);
    }
}

บทสรุป

มีงาน Java ที่ใช้งานได้จริงหลายประเภท และคุณไม่รู้ว่าผู้สัมภาษณ์จะขอให้คุณไขปริศนาประเภทใด แต่นายจ้างที่มีเหตุผลย่อมเข้าใจว่าความสามารถของคุณในการทำงานจริง ให้สำเร็จ เช่น งานที่คุณเจอในงานนั้นสำคัญกว่าความสามารถของคุณในการไขคำถามหลอกๆ ดังนั้นทำสิ่งเหล่านี้ให้ได้มากที่สุด นั่นเป็นเหตุผลที่เราสร้าง CodeGym เนื้อหาจากgeeksforgeeksถูกนำมาใช้เพื่อสร้างบทความนี้
ความคิดเห็น
  • เป็นที่นิยม
  • ใหม่
  • เก่า
คุณต้องลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
หน้านี้ยังไม่มีความคิดเห็นใด ๆ