力扣刷题

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

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需要去报文里找(怎么找 详细细节下午问温睿师兄)

eqIdproduct_Idmessage_Idstart_Timestop_Time

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

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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于力扣刷C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷中,使用 string 可以方便地处理字符串相关的问。 9. 注意边界条件:在力扣刷中,边界条件往往是解决问的关键。需要仔细分析目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值