力扣刷题

之前用python刷了一段时间,后来由于种种原因放弃了,现在转java语言了,还是得捡起来,从今天开始重刷!(题目来源:力扣)

文章目录

    • 1. 两数之和
    • 2.两数相加
    • 3.无重复字符的最长子串
    • 21.合并两个有序列表
    • 26.删除排序数组中的重复项
    • 27.移除元素
    • 28.实现strStr()
        • SQLServer数据导入任务:

1. 两数之和

问题:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i=0;i<nums.length;i++){
            if(!(map.containsKey(target-nums[i]))){
                map.put(nums[i],i);
            }
            else {
                return new int[]{i,map.get(target-nums[i])};
            }
        }
        return null;
    }
}

想法:

使用map将遍历过的索引保存.
每次都去检查当前的数,map的key中是否存在与其相加等于target的数,不存在的话把当前的数和它在数组中的索引添加到map中,存在的话直接返回结果.

2.两数相加

问题:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

代码:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode dummyHead = new ListNode(0);
    ListNode p = l1, q = l2, curr = dummyHead;
    int carry = 0;
    while (p != null || q != null) {
        int x = (p != null) ? p.val : 0;
        int y = (q != null) ? q.val : 0;
        int sum = carry + x + y;
        carry = sum / 10;
        curr.next = new ListNode(sum % 10);
        curr = curr.next;
        if (p != null) p = p.next;
        if (q != null) q = q.next;
    }
    if (carry > 0) {
        curr.next = new ListNode(carry);
    }
    return dummyHead.next;
}

想法:
这道题错得挺惨的,做了很久还是错了,关键点是哑节点的设置,两个链表相加时会有三种情况:

l1=[0,1],l2=[0,1,2] ,l2=[0,1,2]	当一个列表比另一个列表长时
l1=[],l2=[0,1],l2=[0,1]	当一个列表为空时,即出现空列表
l1=[9,9],l2=[1]	求和运算最后可能出现额外的进位,这一点很容易被遗忘


3.无重复字符的最长子串

问题:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 :
输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

代码:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int res =0;
        int i=0,j=0;
        HashSet<Character> set =new HashSet<>();
        while(i<s.length()&&j<s.length()){
            if(set.contains(s.charAt(j))) set.remove(s.charAt(i++));
            else {
                set.add(s.charAt(j++));
                res =Math.max(res,j-i);
            }
        }
        return res;
    }
}

想法:
找子串,子数组,使用滑动窗口法

21.合并两个有序列表

问题:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的

示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {

        if(l1==null){
            return l2;
        }
        if(l2==null){
            return l1;
        }
        ListNode r =l1;
        ListNode l =l2;
        ListNode rs =new ListNode(0);
        ListNode tmp =rs;
        int rv =r.val;
        int lv =l.val;
        int cur_val;
        while(r!=null&&l!=null){
            if(rv<lv){
                cur_val=rv;
                r=r.next;
                rv=r==null?0:r.val;
            }
            else {
                cur_val=lv;
                l=l.next;
                lv=l==null?0:l.val;
            }
            tmp.next =new ListNode(cur_val);
            tmp=tmp.next;

            if(r==null){
                tmp.next =l;
                return rs.next;
            }
            if(l==null){
                tmp.next=r;
                return rs.next;
            }
        }


        return rs.next;
    }
}

想法:
熟悉链表结构,以及链表指针移动

26.删除排序数组中的重复项

问题:
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例 1:

给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 

你不需要考虑数组中超出新长度后面的元素。

示例 2:

给定 nums = [0,0,1,1,1,2,2,3,3,4],

函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。

你不需要考虑数组中超出新长度后面的元素。

代码:

class Solution {
   public int removeDuplicates(int[] nums) {
       int i=0;
       for(int j=1;j<nums.length;j++){
           if(nums[i]!=nums[j]){
               i++;
               nums[i]=nums[j];
           }
       }
       return ++i;
   }
}

想法:
双指针,一个快指针,一个慢指针,这里只要求得不同的数字而已,nums[i]==nums[j]时,直接跳过,!=时,i++将nums[j]给nums[i]就可以。

27.移除元素

问题:
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:


给定 nums = [3,2,2,3], val = 3,

函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。

你不需要考虑数组中超出新长度后面的元素。

示例 2:


给定 nums = [0,1,2,2,3,0,4,2], val = 2,

函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

注意这五个元素可为任意顺序。

你不需要考虑数组中超出新长度后面的元素。

代码:

class Solution {
   public int removeElement(int[] nums, int val) {
       int i=0;
       for(int j=0;j<nums.length;j++){
           if(nums[j]!=val){
               nums[i]=nums[j];
               i++;
           }
       }
       return i;
 
   }
}

想法:
同26题,快慢指针

28.实现strStr()

问题:
实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。

示例 1:

输入: haystack = "hello", needle = "ll"
输出: 2

示例 2:

输入: haystack = "aaaaa", needle = "bba"
输出: -1

说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

代码:

class Solution {
   public int strStr(String haystack, String needle) {
       
       int length =needle.length();
       if(haystack.equals(needle)){
           return 0;
       }
       for(int i=0;i<haystack.length()-length+1;i++){
           if(haystack.substring(i,length+i).equals(needle)){
                   return i;
           }
       }
       return -1;
   }
}

想法:
类似滑动窗口吧,其实可以挨个字符比较,但是java提供了substring函数,比较方便的可以实现
















SQLServer数据导入任务:

  1. sqlserver中建立索引表字段如下:
    eqId (varchar)
    product_Id(varchar)
    message_Id (varchar)
    start_Time(datetime)
    stop_Time(datetime)

product_Id需要去报文里找(怎么找 详细细节下午问温睿师兄)

eqId product_Id message_Id start_Time stop_Time

在将数据导入到HBase中的同时,索引表中数据也要添加

  1. 导出数据库中各个工艺对应的设备数据 (json格式)
    例:
{
	process:"熔铸",
	equipList:[
		{eqId:"39",equip:"热轧推进式加热炉"},
		{eqId:"5F",equip:"90t卷式退火炉(二期)"},
		......
	]	
}

PDO和PDI,作业任务应答,请求 不考虑 统计没有采集时间的 报文

你可能感兴趣的:(力扣刷题)