0%

简单

两数之和

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

最优解,使用哈希表,以空间换取时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.HashMap;
import java.util.Map;

/**
* TowSum
*/
public class TowSum {
private static int[] twoSum(int[] nums, int target) {
int length = nums.length - 1;
// 扩容消耗性能,如果能确定大小就写死
Map<Integer, Integer> hashTable = new HashMap<Integer, Integer>(length);
hashTable.put(nums[0], 0);
for (int i = 1; i < nums.length; i++) {
if (hashTable.containsKey(target - nums[i])) {
return new int[]{hashTable.get(target - nums[i]), i};
}
// 最后一个数字不需要存入哈希表
if (i != nums.length - 1) {
hashTable.put(nums[i], i);
}
}
return new int[]{0, 0};
}
public static void main(String[] args) {
int[] result = twoSum(new int[]{2, 7, 11, 15}, 18);
System.out.println("[" + result[0] + ", "+ result[1] + "]");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hashtable;
for (int i = 0; i < nums.size(); ++i) {
auto it = hashtable.find(target - nums[i]);
if (it != hashtable.end()) {
return {it->second, i};
}
hashtable[nums[i]] = i;
}
return {};
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
struct hashTable {
int key;
int val;
UT_hash_handle hh;
};

struct hashTable* hashtable;

struct hashTable* find(int ikey) {
struct hashTable* tmp;
HASH_FIND_INT(hashtable, &ikey, tmp);
return tmp;
}

void insert(int ikey, int ival) {
struct hashTable* it = find(ikey);
if (it == NULL) {
struct hashTable* tmp = malloc(sizeof(struct hashTable));
tmp->key = ikey, tmp->val = ival;
HASH_ADD_INT(hashtable, key, tmp);
} else {
it->val = ival;
}
}

int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
hashtable = NULL;
for (int i = 0; i < numsSize; i++) {
struct hashTable* it = find(target - nums[i]);
if (it != NULL) {
int* ret = malloc(sizeof(int) * 2);
ret[0] = it->val, ret[1] = i;
*returnSize = 2;
return ret;
}
insert(nums[i], i);
}
*returnSize = 0;
return NULL;
}
1
2
3
4
5
6
7
8
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashtable = dict()
for i, num in enumerate(nums):
if target - num in hashtable:
return [hashtable[target - num], i]
hashtable[nums[i]] = i
return []
1
2
3
4
5
6
7
8
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashtable = dict()
for i, num in enumerate(nums):
if target - num in hashtable:
return [hashtable[target - num], i]
hashtable[nums[i]] = i
return []
阅读全文 »

什么是自动引用计数

  • 自动引用计数(ARC,Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术
  • 自动引用计数降低了程序崩溃、内存泄漏等风险,减少了开发的工作量
  • LLVM 编译器中设置 ARC 为有效状态,就无需再次键入 retain 或者是 release 代码
阅读全文 »

夏、商、西周的政治制度

  • 从禅让制到王位世袭
    • 尧舜时期是采用禅让制
    • 禹建立历史上第一个王朝夏朝,禹死后,儿子启躲得王位,政治权利由传贤变成传子,家天下的局面形成,禅让制王位世袭制所取代
    • 商朝建立后,王位有时父子相传,有时兄终第及
    • 夏商统治者为了巩固自己的地位,说是天的意志,国家大事以占卜的方式决定,给王权带来了神秘的色彩
    • 行政管理制度:
      • 中央:相、卿士等,掌管政务
      • 地方:候和伯,定期向商王纳贡,并奉命征伐
阅读全文 »

集合的含义及其表示

  • 一般地,一定范围内某些确定的、不同的对象的全体构成一个集合(set)。集合中每一个对象称为该集合的元素(element),简称。我们通常用大写拉丁字母来表示集合,例如集合 、集合 等。集合的元素常用小写拉丁字母表示,例如元素
  • 集合的表示方法有三种
    • 列举法,例如:{北京,天津,上海,重庆}
    • 描述法,例如:
    • Venn 图法
阅读全文 »

符号 例子 描述
属于 是集合 的一个元素
不属于 不是集合 的一个元素
诸元素 构成的集合
使命题 为真的 中诸元素的集合
空集
非负整数集;自然数集
正整数集
整数集
有理数集
实数集
包含于 的子集
真包含于 的真子集
不包含于 不是 的子集
的并集
的交集
中子集 的补集或余集
中由 的闭区间
中由 的开区间
中由 (含于内)到 的右半开区间
中由 (含于内)的左半开区间
集合 到集合 的映射
阅读全文 »

诗词短语

《沁园春 · 长沙》毛泽东

漫江:满江。漫,满、遍。例:江碧透、山红艳

橘子洲:风景名胜,在长沙西面的湘江中。例:橘子洲

:大船。例:百争流

:原指鸟盘旋而飞,可形容鱼在清澈的水中轻快地游动。例:鱼浅底

万类:指一切生物。例:万类复苏

霜天:指深秋。例:万类霜天竞自由

怅寥廓:面对广阔的宇宙惆怅感慨。

沉浮:比喻事物的盛衰、消长。

峥嵘:山势高峻,比喻超越寻常,不平常。

:正当,正好。

书生:读书人,可指青年学生。

意气:意志和气概。

挥斥:奔放。

:强劲有力。

激扬:激浊扬清。

粪土:把……看作粪土

万户侯:汉代侯爵的最高一级,享有万户农民的赋税,后泛指有高爵显位的人。

击水:可指游泳

:阻止

阅读全文 »

pthread_create 创建一个新线程

概要

1
2
3
4
5
6
#include <pthread.h>

int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)(void *),
void *arg);

描述

pthread_create() 函数用于在进程内创建一个具有 attr 指定的属性的新线程。如果 attrNULL,则使用默认属性。如果稍后修改 attr 指定的属性,则该线程的属性不会受到影响。成功完成后,pthread_create() 将创建的线程的 ID 存储在线程指定的位置。

阅读全文 »

Objective-C

预编译指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* 
条件编译,这么做是为了不重复导入相同的头文件内容,减少预编译的时间,Objective-C 中的 #import 关键字,效果和下面的代码一样
*/

#ifndef _PTHREAD_H
#define _PTHREAD_H

// 一些头文件
#include <pthread/sched.h>
// ...

#endif /* _PTHREAD_H */

/*
如果有宏定义 __cplusplus,就进入 ...
*/
#define __cplusplus
#if defined(__cplusplus)
// ...
#endif

// 验证某些特性
#if !__has_feature(objc_arc)
// 如果不支持ARC错误提示且编译不通过
#error "啊 啊 啊~ 伦家需要ARC"
#endif
阅读全文 »

为什么要学习多线程

当在主线程执行耗时操作的时候,界面会卡死,阻塞用户交互,影响用户体验。怎么解决这个问题呢?就要使用多线程技术

阅读全文 »