算法笔试题2-Java

(1)翻转链表

链表节点定义:
public class ListNode<T> {
    T val;
    ListNode next;
}
翻转链表关键在于处理中间状态。中间状态是有一部分链表已翻转(用head表示),一部分链表未翻转(用next表示),将next指向的节点加入到head指向的节点,
并且head移动到next的位置,next移动到next.next的位置,此时又回到中间状态。一直迭代直到next为null,此时链表全部已翻转,head指向的就是翻转链表的头。
public ListNode reverse(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode next = head.next;
    head.next = null;
    while (next != null) {
        ListNode tmp1 = head;
        head = next;
        ListNode tmp2 = next.next;
        next.next = tmp1;
        next = tmp2;
    }
    return head;
}

 

(2)小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]..., A[N]}。
牛博士给小易出了一个难题:
对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数。
小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。

输入描述:
输入的第一行为数列的个数t(1 ≤ t ≤ 10),
接下来每两行描述一个数列A,第一行为数列长度n(1 ≤ n ≤ 10^5)
第二行为n个正整数A[i](1 ≤ A[i] ≤ 10^9)
输出描述:
对于每个数列输出一行表示是否可以满足牛博士要求,如果可以输出Yes,否则输出No。
输入例子1:
2
3
1 10 100
4
1 2 3 4
输出例子1:
Yes
No
/**
本题关键是确定所有相邻两数相乘能被4整除的条件,设能被4整除的数个数为t_4,能被2整除不能被4整除的数个数为t_2,其它数个数为t_1,则能被4整除需要满足如下条件:
(1)t_2>0时,t_4>=t1,此时把所有t_2数排在左边,t_4/t_1间隔排在右边即可,t_4/t_1数不存在也不影响
(2)t_2=0时,t_4必须有,则t_4>=1,把t_4插入所有t_1数中间需要的t_4数量最少,此时t_4=t_1-1,所以t_4>=t1-1,t_4数量多无影响
*/
import
java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int t = scanner.nextInt(); for (int i = 0; i < t; i++) { int count = scanner.nextInt(); int[] arr = new int[count]; for (int j = 0; j < count; j++) { arr[j] = scanner.nextInt(); } int t_4 = 0, t_2 = 0, t_1 = 0; for(int num: arr) { int n = num; if (n % 4 == 0) { t_4++; } else if (n % 2 == 0) { t_2++; } else { t_1++; } } boolean can = false; if (t_2 > 0) { can = t_4 >= t_1; } else { can = t_4 > 0 && (t_4 >= t_1 - 1); } System.out.println(can ? "Yes" : "No"); } } }

(3)归并两个排好序的链表

 

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Main {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if (list1 == null) {
            return list2;
        }
        if (list2 == null) {
            return list1;
        }
        ListNode head = null, iter = null;
     // 确定头元素
if (list1.val < list2.val) { head = iter = list1; list1 = list1.next; } else { head = iter = list2; list2 = list2.next; } while (list1 != null && list2 != null) { if (list1.val < list2.val) { iter = iter.next = list1; list1 = list1.next; } else { iter = iter.next = list2; list2 = list2.next; } } while (list1 != null) { iter = iter.next = list1; list1 = list1.next; } while (list2 != null) { iter = iter.next = list2; list2 = list2.next; } return head; } }

 

posted @ 2018-01-07 16:29  爱读书的小明  阅读(126)  评论(0编辑  收藏  举报