笔试题
一共五题,第一道简单/普通难度,第二道普通难度,三四五大概是普通/困难吧.
分组交换链表
一个链表两个一组,前后两组交换,递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class ListNode { int val; ListNode next = null; }
public class Solution { public ListNode reorderList(ListNode head) { if (head == null) { return head; } else if (head.next == null) { return head; } else if (head.next.next == null) { return head; } else if (head.next.next.next == null) { return head; } ListNode nextHead = reorderList(head.next.next.next.next); ListNode thirdNode = head.next.next; thirdNode.next.next = head; head.next.next = nextHead; return thirdNode; } }
|
可能的字符串
在每个字符串中选择一个字符,组成所有自负不重复的子字符串
例如 ab,ca,ccb –> acb , bac
很明显用回溯算法,但是没写出来,只好用暴力解法,结果超时.
下面是一个四不像.
edit : 第二天再写,只花了五分钟就改好了(果然还是考试时太着急了点),下面是成品(没有跑太多测试):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Scanner; import java.util.Set;
public class Solution {
public int result = 0; public int sumFloor;
public List<String> handleInput() { List<String> list = new ArrayList<String>(); Scanner in = new Scanner(System.in); int n = in.nextInt(); in.nextLine(); for (int i = 0; i < n; i++) { list.add(in.nextLine()); } in.close(); return list; }
public int findSubString(List<String> ss) { Set<Character> stack = new HashSet<>(); sumFloor = ss.size(); backstack(0, stack, ss); return result; }
public void backstack(int floor, Set<Character> stack, List<String> ss) { if (floor == sumFloor) { result++; return; } for (char c : ss.get(floor).toCharArray()) { if (stack.contains(c)) { return; } else { stack.add(c); backstack(floor + 1, stack, ss); stack.remove(c); } } }
public static void main(String[] args) { Solution foo = new Solution(); List<String> ss = new ArrayList<>(); ss.add("ab"); ss.add("ca"); ss.add("ccb"); System.out.println(foo.findSubString(ss)); } }
|
后记
算法题挺久没刷了,手生了.
leetcode的题目都是写接口,对手动处理输入不熟悉.