Kotlin学习笔记——基础语法篇之类和对象

类的构造

Kotlin类的写法

  1. Kotlin类的构造函数分为主构造函数和二级构造函数
  2. 主构造函数的特点——函数名为init,参数要写在类名后面(下面举例),一般用于初始化
  3. 如果要在java中调用kotlin的类,要在类名前面加上@JvmOverloads(让java能够识别默认参数),并且补充constructor关键字
  4. 主构造函数的参数写在类名后,如果没有@JvmOverloads修饰,constructor关键字可省略(不是指二级构造函数的constructor,是类名后面的)
  5. 二级构造函数用constructor关键字
  6. 二级构造函数的特点——可有可无,相互独立,如果有主构造函数,先调用主构造函数

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Animal (type:String = "动物", name:String) {
//没有@JvmOverloads修饰,可以省略constructor
//等价以下写法
//class Animal constructor(type:String = "动物", name:String) {
var Type:String = ""
var Name:String = ""
var Age:Int = 0
var Sex:String = ""
init {
Type = type
Name = name
}
constructor(type:String = "动物", name:String, age:Int, sex:String) : this(type, name){
Age = age
Sex = sex
}

}

类的成员

阅读更多

Kotlin学习笔记——基础语法篇之控制语句

if…else…

用法

Kotlin中if...else...基本用法与C/C++java中相同

例子

1
2
3
4
5
6
7
8
button.setOnClickListener {
if (flag) {
text.text = "I love you, at the first sight of you."
} else {
text.text = "I love three things in this world.Sun, moon and you. " +
"Sun for morning, moon for night, and you forever."
}
}

而Kotlin的if else可以有返回值

阅读更多

Kotlin学习笔记——基础语法篇之特殊运算符

参考文献——Kotlin学习之运算符
来自简书作者——Hunter_Arley

等值判断

运算符 解释 重载函数
a == b 判断ab是否结构相等,相当于java中a.equals(b)或b.equals(a) a?.equals(b)?:b===null
a != b 判断ab是否结构不等,相当于java中!a.equals(b)或!b.equals(a) !(a?.equals(b)?:b===null)
=== 判断是否结构相等且引用相同
  • ps: Kotlin中的==用来比较两个元素是否相同,比如字符串的内容,整数,浮点数的值,而不比较引用是否相同,而===表示比较内容是否相同,且引用是否相同

新增运算符

运算符 解释 重载函数
is 判断变量是否为某个类型
a in b 检查元素a是否在b中 b.contains(a)
阅读更多

LeetCode-1

1.两数之和

AC代码

思路

  • 刚开始就是用双层for循环写,然后秉承着谦虚的态度看了题解,发现真的有O(N)的算法一遍哈希表

  • 主要就是利用map建立从数到数组下标的map,然后每次计算出target-nums[i]的值,然后看map里面有对应的下标,有的话就输出,没有就继续。

  • map的值为0时,如何区分stl的map知识有限,如何判断0是数组里面没有这个数还是查询的引索为0呢?只要储存的时候下标+1,用的时候减一就行了,这样map值为0,一定是没有这个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
map<int, int> m;
for (int i = 0; i < nums.size(); i++) {
int pos = target - nums[i];
if (m[pos] != 0 && m[pos] != i + 1) {
pos = m[pos] - 1;
ans.push_back(pos > i ? i : pos);
ans.push_back(pos < i ? i : pos);
break;
}
m[nums[i]] = i + 1;
}
return ans;
}
};

2. 两数相加

阅读更多

LeetCode-2

20. 有效的括号

思路

  1. 创建一个栈
  2. 遍历字符串
    1. 如果是左半部分,把这个字符压栈
    2. 如果是右半部分,先看一下栈顶元素和它是否配对,如果配对,弹栈,不配对,结束,返回false
  3. 字符串遍历结束后,看栈是否已经空了,如果没空,说明左右括号数量不对应false

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
static const auto __ = []() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
bool isValid(string s) {
int p[128] = {0};
p['('] = ')'; p[')'] = 0;
p['['] = ']'; p[']'] = 0;
p['{'] = '}'; p['}'] = 0;
stack<char> sta;
for (int i = 0; i < s.length(); i++) {
if (p[s[i]]) {
sta.push(s[i]);
} else {
if (sta.empty() || p[sta.top()] != s[i]) return false;
sta.pop();
}
}
return sta.empty();
}
};

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

阅读更多

LeetCode-3

58. 最后一个单词的长度

AC代码

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int lengthOfLastWord(string s) {
reverse(s.begin(), s.end());
stringstream ss(s);
string buf;
ss >> buf;
reverse(buf.begin(), buf.end());
return buf.length();
}
};
1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int lengthOfLastWord(string s) {
int count = 0;
for (int i = s.length() -1 ; i >= 0; i--) {
if (s[i] != ' ')count++;
else if (count > 0) break;
}
return count;
}
};

66. 加一

思路

阅读更多

LeetCode-4

172. 阶乘后的零

思路

把2,5的倍数拆成2,5,数5的个数(2一定比5多),这样5一定和2配对,所以5的个数就是末尾0的个数

AC代码

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int trailingZeroes(int n) {
int ans = 0;
while (n) {
n /= 5;
ans += n;
}
return ans;
}
};
1
2
3
4
5
6
class Solution {
public:
int trailingZeroes(int n) {
return n == 0 ? 0 : n/5 + trailingZeroes(n / 5);
}
};
阅读更多

LeetCode-6

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

思路

双指针

  1. 如果字符串长度为1的话,直接返回1
  2. 建立哈希表,储存字符所在的位置(从1开始数)
  3. i,j两个指针,i用来遍历字符串(位置靠前),j用来记录当前不重复的字符的位置
  4. 每次循环,先查询map中s[i]的位置,如果在j的字符之前,说明从i到j没有重复字符
  5. 如果位置在j或j之后,说明出现重复字符,那么先不移动j,i-j的值就是一个非重复子串的长度
  6. 然后让j指向s[i]的下一个位置,这样就又变成了一个不重复的子串
  7. 循环结束,但是最后一次的统计没有记录,再记录一次。

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.length() == 1) return 1;
unordered_map<char, int> m;
int len = s.length();
int count = 0;
int max = 0;
int i = 0, j = 0;
for ( ; i < len; i++) {
if (m[s[i]] < j + 1) {
m[s[i]] = i + 1;
} else {
count = i - j;
j = m[s[i]];
max = max > count ? max : count;
m[s[i]] = i + 1;
}
}
count = i - j;
max = max > count ? max : count;
return max;
}
};
阅读更多

LeetCode-7

532. 数组中的K-diff数对

思路

  1. map,保存每个数出现的次数
  2. 遍历map,如果要找差为0的数对,那么如果出现次数大于1,说明有一对儿
  3. 如果差不是0,算出另一个数,在map里面查询,查询到了就是一对儿

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
int findPairs(vector<int>& nums, int k) {
if (k < 0) return 0;
map<int, int> m;
for (int x : nums) {
m[x]++;
}
int ans = 0;
auto ite = m.begin();
while (ite != m.end()) {
if (k) {
int sum = ite->first + k;
if (m.count(sum)) ans++;//这里要用count函数查询是否存在元素,直接访问会超时
} else {
if (ite->second > 1) ans++;
}
ite++;
}
return ans;
}
};

70. 爬楼梯

阅读更多

LeetCode-8

581. 最短无序连续子数组

思路

  1. 拷贝把备份排序,然后两个指针,依次从头到尾(i),从尾到头(j)比较排序前后两个数组相同下标的值,把第一次不同的下标值记录,最后返回j - i + 1,如果为负数返回0。

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
vector<int> cpy(nums.begin(), nums.end());
sort(cpy.begin(), cpy.end());
int len = nums.size();
int j = len - 1, i = 0;
for ( ; j >= 0; j--) {
if (nums[j] != cpy[j]) {
break;
}
}
for (; i < len; i++) {
if (nums[i] != cpy[i]) {
break;
}
}
int ans = j - i + 1;
return ans > 0 ? ans : 0;
}
};

思路

阅读更多