【程序员札记#学习&&塑形# 】2018年5月04号

时间:2023-02-12 21:56:00
 
回顾
  
  工作:pendding
  学习:看算法导论第一章,leetcode还在做(本身翻译错误,被误导了)。
  体会:
    1) 浩俊之前推荐让我看的《算法导论》,昨天再回过头看,里面很多确实是机器学习常用的方式,部分内容,如动态规划,水哥也提到过。所以算法导论也得结合着看。
    2) 《机器学习》理解行业术语,《算法导论》提升思维粒度。
    3) 昨天饮食整体控制的不是特别好,晚间吃了过多的零食。
    4) 今天开始日记开始迁移到博客园!
 
 
Todo list
  
 
  1. 工作:新闻排重评估 (紧急重要的)今天务必完成。
  2. 工作:数据监控系统方案调研 (非紧急重要的)
  3. 健康:跑步7公里(完成)
  4. 学习:leetcode做一道算法题(非紧急重要的)
  5. 健康:后背训练;(非紧急非重要的)
  6. 学习:算法导论(非紧急重要的) 
 
上午
  
  早餐:空腹
  运动:跑步7公里
 
   【程序员札记#学习&&塑形# 】2018年5月04号

 

 

 

  【程序员札记#学习&&塑形# 】2018年5月04号

 

 
中午
  
   

 
下午
  
 待续....
    

 
分享
  
 
  1、leetcode两数之和
【程序员札记#学习&&塑形# 】2018年5月04号【程序员札记#学习&&塑形# 】2018年5月04号
#include <vector>
#include <map>
/**
*
*给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
*你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
*case:
*给定 nums = [2, 7, 11, 15], target = 9
*因为 nums[0] + nums[1] = 2 + 7 = 9
*所以返回 [0, 1]
*/
using namespace std;
class Solution {
public:
    // 两两对比的方式,时间复杂度为O(n2)
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> ret;

        // 第一种
        /*for (int i = 0; i < nums.size(); i++) {
            for (int j = i + 1; j < nums.size(); j++) {
                if (nums[i] + nums[j] == target) {
                    ret.push_back(i);
                    ret.push_back(j);
                    return ret;
                }
            }
        }*/

        // 第二种:数据插入到hashmap里,然后通过target - nums[i]来确定,时间复杂度为O(2n)
        map<int, int> m;
        for (int i = 0; i < nums.size(); i++) {
            m[nums[i]]  = i;
        }
        for (int i = 0; i < nums.size(); i++) {
            if (m.count(target - nums[i]) > 0 && i != m[target - nums[i]]) {
                ret.push_back(i);
                ret.push_back(m[target - nums[i]]);
                return ret;
            }
        }
        return ret;
    }
};
View Code

 

 
  2、leetcode两数相加:
【程序员札记#学习&&塑形# 】2018年5月04号【程序员札记#学习&&塑形# 】2018年5月04号
#include <vector>
#include <map>
#include <iostream>
#include <math.h>
/**
*
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
*/
using namespace std;

struct ListNode{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL){}
};

template<class T>
int length(T& arr) {
    return sizeof(arr)/ sizeof(arr[0]);
}

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        uint64_t carry = 0, sum = 0;
        ListNode prehead(0), *p = &prehead;

        while (l1 || l2) {
            sum =  (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
            sum = carry / 10;
            p->next  = new ListNode(sum % 10);

            l1 = l1 ? l1->next : l1;
            l2 = l2 ? l2->next : l2;
            p = p->next;
        }
        return prehead.next;
    }
};

int main(int argc, char** argv){
    int a[] = {2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,9};
    ListNode* tmp = new ListNode(0);
    ListNode* ptr1 = tmp;
    for (int i = 0; i < length(a); i++) {
        ptr1->next = new ListNode(a[i]);
        ptr1 = ptr1->next;
    }
    ptr1 = tmp->next;
    delete tmp;

    tmp = new ListNode(0);
    int b[] = {5,6,4,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,9,9,9,9};
    ListNode* ptr2 = tmp;
    for (int j = 0; j < length(b); j ++) {
        ptr2->next = new ListNode(b[j]);
        ptr2 = ptr2->next;
    }
    ptr2 = tmp->next;
    delete tmp;

    Solution* solution = new Solution();
    solution->addTwoNumbers(ptr1, ptr2);
    delete solution;
    return 0;
}
View Code

 

  3、一个文件里的第一列为id,匹配另一个文件里的行记录,并进行输出!
BEGIN{
}
FILENAME == ARGV[1] {
	gsub(/ /,"", $1);
	sentence_id[$1] = $0;
}

FILENAME == ARGV[2] {
	gsub(/ /,"", $1);
	if (sentence_id[$1] != "") {
			print $0;
	}
}

END{
}


awk -F"\t" -f tmp/news_dup.awk 1.txt ~/data/20180411/2  > t1.txt

  

 
推荐
 
 
 
【程序员札记#学习&&塑形# 】2018年5月04号