之前用python刷了一段时间,后来由于种种原因放弃了,现在转java语言了,还是得捡起来,从今天开始重刷!(题目来源:力扣)
问题:
给定一个整数数组 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中,存在的话直接返回结果.
问题:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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] 求和运算最后可能出现额外的进位,这一点很容易被遗忘
问题:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 :
输入: "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;
}
}
想法:
找子串,子数组,使用滑动窗口法
问题:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
示例:
输入: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;
}
}
想法:
熟悉链表结构,以及链表指针移动
问题:
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 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]就可以。
问题:
给定一个数组 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题,快慢指针
问题:
实现 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函数,比较方便的可以实现
product_Id需要去报文里找(怎么找 详细细节下午问温睿师兄)
eqId | product_Id | message_Id | start_Time | stop_Time |
---|---|---|---|---|
… | … | … | … | … |
在将数据导入到HBase中的同时,索引表中数据也要添加
{
process:"熔铸",
equipList:[
{eqId:"39",equip:"热轧推进式加热炉"},
{eqId:"5F",equip:"90t卷式退火炉(二期)"},
......
]
}
PDO和PDI,作业任务应答,请求 不考虑 统计没有采集时间的 报文