LC836. 矩形重叠
// 如果两个矩阵面积都为0那么返回false即可。但如果两个面积都大于0,我们就需要判断他们是否有重叠的部分,将rec2固定以后,将rec1的置于rec2的左边上边右边和下边 并且最大值不能超过左右下角的边界值。(数学题)
class Solution {
public boolean isRectangleOverlap(int[] rec1, int[] rec2) {
if(rec1[0] == rec1[2] || rec1[1] == rec1[3] || rec2[0] == rec2[2] || rec2[1] == rec2[3]){
return false;
}
return !(rec1[2] <= rec2[0]|| //left
rec1[0] >= rec2[2] || //right
rec1[1] >= rec2[3] || //top
rec1[3] <= rec2[1]); //bottom
}
}
LC12. 整数转罗马数字
//贪心算法,我们将所有罗马的情况列举出来并且对应value值,从最大的值开始递减循环迭代,每次都取最大的那个value那么出来的res肯定是正确的。(贪心法则:我们每次尽量使用最大的数来表示。)
class Solution {
public String intToRoman(int num) {
int[] values = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
String[] roma = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
StringBuffer res = new StringBuffer();
for(int i = 0;i < values.length;i++){
while(num >= values[i]){
res.append(roma[i]);
num -= values[i];
}
}
return res.toString();
}
}
LC两数之和(链表经典面试题)
//不记得第几次做了,还是有点迷糊依稀记得有个carry进制位并且如何进行遍历的条件也很含糊。记得需要添加头节点,其实就是个位就是位于链表的首部,我们只需要从两链表头部进行一个遍历操作即可,只要其中一个链表不为空我们就可以进入循环,当然在循环当中处理完当前节点的结果以后需要判断当前的链表节点是否为空如果为空我们就不能跳入 next域
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode cur = dummy;
int carry = 0;
while(l1 != null || l2 != null){
int x = l1 == null ? 0 : l1.val;
int y = l2 == null ? 0 : l2.val;
int sum = x + y + carry;
carry = sum / 10;
sum = sum % 10;
cur.next = new ListNode(sum);
cur = cur.next;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
if(carry == 1)
cur.next = new ListNode(carry);
return dummy.next;
}
}