public class E62LastRemainNumber {
//圆圈中最后剩下的数字
/*解法一:构造环形链表*/
static class ListNode<T> {
//环形链表节点
T value;
ListNode<T> nextNode;
ListNode(T value) {
this.value = value;
}
}
static class AnnularLinkedList<T> {
//链表结构
private int size;
private ListNode<T> first;
private ListNode<T> last;
public int size() {
return size;
}
public ListNode<T> getFirstNode() {
if (size == 0)
throw new IllegalArgumentException("Empty!");
return first;
}
public ListNode<T> getLastNode() {
if (size == 0)
throw new IllegalArgumentException("Empty!");
return last;
}
public void add(T element) {
ListNode<T> node = new ListNode<>(element);
if (size == 0) {
first = node;
last = node;
} else {
last.nextNode = node;
last = node;
}
size++;
}
public void remove(ListNode<T> listNode) {
if (size == 0)
throw new IllegalArgumentException("Empty! No element to remove!");
ListNode<T> pre = first;
ListNode<T> node = pre;
while (node != null && node != listNode) {
pre = node;
node = node.nextNode;
}
if (node == null)
throw new IllegalArgumentException("No Such Element!");
else if (size == 1) {
first = null;
last = null;
}
else if (pre == node){
first = node.nextNode;
}
else{
pre.nextNode = node.nextNode;
}
size--;
}
}
public static int getNumber1(int n, int m) {
if (n < 1 || m < 1)
return -1;
AnnularLinkedList<Integer> list = new AnnularLinkedList<>();
for (int i = 0; i < n; i++)
list.add(i);
ListNode<Integer> current = list.getFirstNode();
while (list.size() > 1) {
for (int i = 1; i < m; i++) {
current = current.nextNode;
if (current == null)
current = list.getFirstNode();
}
ListNode<Integer> next = current.nextNode;
if (next == null)
next = list.getFirstNode();
list.remove(current);
current = next;
}
return current.value;
}
/*解法二:推导出数学公式*/
public static int getNumber2(int n, int m){
if (n < 1 || m < 1)
return -1;
int result = 0;
for (int i = 2; i <= n; i++){
result = (result + m) % i;
}
return result;
}
//测试用例
public static void main(String[] args) {
System.out.println(E62LastRemainNumber.getNumber1(4000, 997)); //1027
System.out.println(E62LastRemainNumber.getNumber2(4000, 997)); //1027
}
}
圆圈中最后剩下的数字(Java实现)
最新推荐文章于 2022-07-10 16:26:13 发布