Rumah >
Java >
javaTutorial >
Bagaimana untuk menyelesaikan masalah Joseph dalam java
Bagaimana untuk menyelesaikan masalah Joseph dalam java
王林
Lepaskan: 2023-06-03 09:49:20
ke hadapan
1929 orang telah melayarinya
1 Pengenalan kepada Soalan Joseph
1. orang bernombor k (1
2. Analisis masalah:
Menurut huraian masalah, mudah untuk difikirkan menggunakan senarai pautan pekeliling sehala untuk mensimulasikannya. Mula-mula bentuk senarai terpaut bulat sehala dengan n nod, dan kemudian kira nod K bermula dari 1. Apabila m dikira, nod yang sepadan dipadamkan daripada senarai terpaut, dan kemudian pengiraan bermula dari 1 dari nod dipadam seterusnya sehingga semua Nod dipadamkan.
Senarai pautan pekeliling sehala
2. Pembinaan senarai terpaut pekeliling sehala
1 >
Mula-mula buat nod pertama, tuding kepadanya dengan penuding pertama, dan seterusnya menghala pada dirinya sendiri, seperti yang ditunjukkan di bawah:
Nod pertama
dan seterusnya, anda boleh membina senarai terpaut bulatan sehala . Apabila melintasi, apabila nod seterusnya adalah sama dengan yang pertama, ini bermakna bahawa traversal telah selesai.
2. Pelaksanaan kod:
Berdasarkan analisis di atas, kod berikut boleh ditulis: 1 Idea:
Mula-mula cari nod tempat pengiraan bermula, dan gunakan cur untuk merekodkannya, contohnya, dari nombor permulaan k, maka cur harus menunjuk ke nod k, kemudian mencari nod sebelumnya cur dan merekodkannya dengan pra selepas mencari dua nod ini, mula mengira (m-1) kali dari cur, iaitu, cur dan pra bergerak pada masa yang sama (m-1) kali, pada masa ini cur menghala ke nod yang akan dipadamkan; , dan pra seterusnya menghala ke lekuk baharu, iaitu .
2. Pelaksanaan kod:
<code>/**<br> * 出圈,圈中共有n个人,从第k个开始,数m个开始出圈<br> * @param k<br> * @param m<br> * @param n<br> */<br> public void get(int k, int m, int n){<br> if (k > n || k n){<br> throw new IllegalArgumentException("非法参数");<br> }<br> // 先找到k节点,即开始报数的节点,用cur记录下来<br> Node cur = first;<br> for (int i = 1; i cur = cur.getNext();<br> }<br> // 找到k的前一个节点,用pre记录下来<br> Node pre = cur;<br> while (true){<br> if (pre.getNext() == cur){<br> break;<br> } else{<br> pre = pre.getNext();<br> }<br> }<br> // 出圈<br> while (true) {<br> if (pre == cur) { // 只有一个节点了<br> System.out.printf("小孩编号%d\n", cur.getNo());<br> break;<br> }<br> // cur和pre同时移动 m-1次<br> for (int i = 1; i cur = cur.getNext(); // 这个就是要出圈的节点<br> pre = pre.getNext(); // 这个是要出圈节点的前一个节点<br> }<br> System.out.printf("小孩编号%d\n", cur.getNo());<br> cur = cur.getNext();<br> pre.setNext(cur);<br> }<br> }</code>
Salin selepas log masuk
Apabila parameter input ialah k=1, m=2, n=5, hasil daripada melaksanakan kaedah ini adalah sama seperti analisis di atas, jujukan keluaran ialah 2,4,1,5,3.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah Joseph dalam java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn