LeetCode 经典面试题
1、问题一、给出两个整数数组nums1和nums2,按非降序排序,以及两个整 数m和n,分别表示nums1和nums2中的元素。 将nums1和nums2合并为一个数组,按非降序排.
最终排序的数组不应由函数返回,而是存储在数组nums1中。为了适应这种情况,nums1的长度为m+n,其中前m个元素表示应该合并的元素,最后n个元素设置为0,应该忽略。nums2的长度为n。
Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]
Constraints:
-10^9 <= nums1[i], nums2[i] <= 10^9
nums1.length == m + n
nums2.length == n
1 int[] mergeSortedArrays(int[] nums1,int m, int[]nums2,int n) 2 { 3 int k = 0; 4 for (int i = m; i < m+n; i++) 5 { 6 nums1[i] = nums2[k++]; 7 } 8 Array.Sort(nums1); 9 return nums1; 10 } 11 12 int[] nums1 = { 1, 2, 3, 0, 0, 0 }; 13 int[] nums2 = { 2, 5, 6 }; 14 15 foreach (var item in mergeSortedArrays(nums1, 3, nums2, 3)) 16 { 17 Console.WriteLine(item); 18 } 19 20 Console.ReadLine();
2、给定已排序链表的标题,删除所有重复项,使每个元素只出现一次,返回已排序的链表
2.1因为链表原本就是有顺序的,所以只有相邻的两节点的值可能相等,所以只需比较相邻结点。如果相邻结点值相等,则当前结点指向下一结点的下一结点,即删除相同值的结点
1 Node removeRepeatNode(Node root) 2 { 3 if (root==null) 4 { 5 return root; 6 } 7 var currentNode = root; 8 while (currentNode.next!=null) 9 { 10 if (currentNode.next.value==currentNode.value) 11 { 12 currentNode.next = currentNode.next.next; 13 } 14 else 15 { 16 currentNode = currentNode.next; 17 } 18 } 19 20 return root; 21 }
1 public class Node 2 { 3 public int value { get; set; } 4 public Node next { get; set; } 5 }
2.2递归:时间复杂度与上一致,但空间复杂度较大。
public ListNode deleteDuplicates(ListNode head) { if(head ==null || head.next == null) return head; head.next = deleteDuplicates(head.next); return head.val == head.next.val ? head.next : head; }
3、给定字符串,回文返回true ,否则返回false
/// <summary> /// Determines whether the string is a palindrome. /// </summary> public static bool IsPalindrome(string value) { int min = 0; int max = value.Length - 1; while (true) { if (min > max) { return true; } char a = value[min]; char b = value[max]; if (char.ToLower(a) != char.ToLower(b)) { return false; } min++; max--; } }
static void Main() { string[] array = { "civic", "deified", "deleveled", "devoved", "dewed", "Hannah", "kayak", "level", "madam", "racecar", "radar", "redder", "refer", "repaper", "reviver", "rotator", "rotor", "sagas", "solos", "sexes", "stats", "tenet", "Dot", "Net", "Perls", "Is", "Not", "A", "Palindrome", "" }; foreach (string value in array) { Console.WriteLine("{0} = {1}", value, IsPalindrome(value)); } }
/// <summary> /// 另一种解法 /// Determines whether the string is a palindrome. /// </summary> public static bool IsPalindrome(string value) { int min = 0; int max = value.Length - 1; while (true) { if (min > max) { return true; } char a = value[min]; char b = value[max]; // Scan forward for a while invalid. while (!char.IsLetterOrDigit(a)) { min++; if (min > max) { return true; } a = value[min]; } // Scan backward for b while invalid. while (!char.IsLetterOrDigit(b)) { max--; if (min > max) { return true; } b = value[max]; } if (char.ToLower(a) != char.ToLower(b)) { return false; } min++; max--; } }
第三题:原文地址:https://www.dotnetperls.com/palindrome