1 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。

示例 1:

输入: "hello"

输出: "olleh"

示例 2:

输入: "A man, a plan, a canal: Panama"

输出: "amanaP :lanac a ,nalp a ,nam A"

实现

方法一:  转换为数组进行反转

思路:

先转化为数组

使用数组的反转方法进行反转

再转换为字符串返回

/**

* @param

* s [string]

* @return

* [string]

*/

var reverseString = function(s) {

let ary = s.split('');

ary.reverse();

return ary.join('');

};

方法二: 从后往前循环每个字符

思路:

创建新字符串,从后往前循环每个字符

让当前字符拼接进创建的字符串中

返回创建的字符串

var reverseString = function(s) {

let str = '',

i = s.length-1;

while (i>=0) {

str += s[i];

i--;

}

return str;

};

2 颠倒整数

描述

给定一个 32 位有符号整数,将整数中的数字进行反转。

示例 1:

输入: 123

输出: 321

示例 2:

输入: -123

输出: -321

示例 3:

输入: 120

输出: 21

注意:

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。

实现

方法一:  转化为字符串,再转化为数组进行反转

思路:

转化为字符串,然后转化为数组

判断第一个是否为 负号,如果是就去掉第一个,然后进行反转

如果不是,就直接进行反转

反转后判断第一个是否为 0,如果是则去掉

然后将数组转化为字符串,如果前面第一个是负号的情况,再把符号加回去

转化为数字,判断是否超出范围,不超出就直接返回这个数字

超出就返回 0

/**

* @param

* x [number]

* @return

* [number]

*/

var reverse = function(x) {

let str = x+'',

ary = str.split(''),

num = 0;

if (ary[0] === '-') {

ary.shift();

ary.reverse();

if (ary[0] === '0') {

ary.shift();

}

num = Number('-' + ary.join(''));

return num < -(2 ** 31) ? 0 : num;

}

ary.reverse();

if (ary[0] === '0') {

ary.shift();

}

num = Number(ary.join(''));

return num > (2 ** 31-1) ? 0:num;

};

方法二 直接进行数值计算

思路:

如果是 0,直接返回 0 即可

每次循环,将 x 的最后一位通过取余的方式获得并添加在结果的最后一位上 result * 10 + x % 10。这样不管正负都是可行的

进行结果的最大最小限制,放在前面是为了优化,只要计算过程中有超过的就可以直接结束,返回 0

去掉 x 的最后一位(通过除以 10),这里需要进行判断,x 为正时就向下取整,为负时,就向上取整,直到 x 等于 0 为止,循环结束,返回结果

var reverse = function(x) {

if (x === 0) return 0;

let min = -(2 ** 31),

max = 2 ** 31-1;

let result = 0;

while (x !== 0) {

result = result * 10 + x % 10;

if (result > max || result < min) return 0;

if (x < 0) {

x = Math.ceil(x/10);

} else {

x = Math.floor(x/10);

}

}

return result;

};

3 字符串中的第一个唯一字符

描述

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

案例:

s = "leetcode"

返回 0.

s = "loveleetcode",

返回 2.

注意事项:您可以假定该字符串只包含小写字母。

实现

方法一 前后出现索引是否一致

思路:

从开始往后循环字符串

判断当前字符在字符串中前后出现的索引是否一致

一致则没有重复,返回当前字符索引

不一致则继续循环

如果循环结束都没有返回值,则返回 -1

/**

* @param

* s [string]

* @return

* [number] index

*/

var firstUniqChar = function(s) {

//=> 如果大小写算作重复的话

s = s.toLowerCase();

for (let i = 0; i < s.length; i++) {

let item = s[i];

if (s.indexOf(item) === s.lastIndexOf(item)) {

return i;

}

}

return -1;

};

方法二 双循环

思路:

循环字符串,让每个字符都与字符串中的其它字符进行比较

如果存在重复的,那么后面就不需要再继续比较了,直接跳出里层循环,继续下一次外层循环

外层循环中需要进行标记,记录是否存在重复,如果不存在,则直接返回这个索引,结束函数

最后所有循环都结束还没有返回,则返回 -1

var firstUniqChar = function(s) {

//=> 如果大小写算作重复的话

s = s.toLowerCase();

for (let i = 0; i < s.length; i++) {

//=> 记录是否存在重复,true 为不存在重复

let flag = false;

for (let j = 0; j < s.length; j++) {

if (j !== i && s[i] === s[j]) {

flag = true;

break;

}

}

if (!flag) {

return i;

}

}

return -1;

};

4 有效的字母异位词

描述

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"

输出: true

示例 2:

输入: s = "rat", t = "car"

输出: false

说明:

你可以假设字符串只包含小写字母。

进阶:

如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

实现

方法一 利用替换删除字符

思路:

循环第一个字符串,将第二个字符串中替换当前字符为空,即,如果当前字符在第二个字符串中存在,则删除,不存在,则什么也不干

循环结束后,如果第二个字符串中还有字符,则不是异位词,返回 false

否则返回 true

/**

* @param

* s [string] first word

* t [string] second word

* @return

* [boolean]

*/

var isAnagram = function(s, t) {

//=> 如果长度不一样,直接返回 false

if (s.length !== t.length) return false;

for (let i = 0; i < s.length; i++) {

t = t.replace(s[i], '');

}

if (t.length !== 0) {

return false;

}

return true;

};

如果存在 Unicode 字符,利用正则,将其替换正常的字符(使用String.fromCodePoint())

5 验证回文字符串

描述

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama"

输出: true

示例 2:

输入: "race a car"

输出: false

实现

方案一 利用正则替换和反转字符串

思路:

利用正则替换掉不是数字和字母的字符

由于忽略大小写,将其变为小写

反转字符串

将反转字符串和原字符串比较,相等则是回文,返回 true

否则返回 false

/**

* @param {string} s

* @return {boolean}

*/

var isPalindrome = function(s) {

s = s.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();

let str = s.split('').reverse().join('');

if (str === s) return true;

return false;

};

方案二 利用正则替换和折半比较

思路:

利用正则替换掉不是数字和字母的字符

由于忽略大小写,将其变为小写

算出需要的中间值(从左开始)

分别从左开始和从右开始循环比较,直到左边到达中间值为止

如果存在不相等的,则返回 false

循环结束都没有返回,则返回 true

var isPalindrome = function(s) {

s = s.replace(/[^0-9a-zA-Z]/g, '').toLowerCase();

let mid = Math.floor(s.length/2)-1,

i = 0,

j = s.length - 1;

while (i <= mid) {

if (s[i] !== s[j]) {

return false;

}

i++;

j--;

}

return true;

};

6 字符串转整数(atoi)

描述

实现 atoi,将字符串转为整数。

在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。

当字符串中的第一

个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。

若函数不能执行有效的转换,返回 0。

说明:

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过

可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

输入: "42"

输出: 42

示例 2:

输入: "-42"

输出: -42

解释: 第一个非空白字符为 '-', 它是一个负号。

我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例 3:

输入: "4193 with words"

输出: 4193

解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

示例 4:

输入: "words and 987"

输出: 0

解释: 第一个非空字符是 'w', 但它不是数字或正、负号。因此无法执行有效的转换。

示例 5:

输入: "-91283472332"

输出: -2147483648

解释: 数字 "-91283472332" 超过 32 位有符号整数范围。因此返回 INT_MIN (−231) 。

实现

方法一 利用 parseInt 以及 isNaN

思路:

使用 parseInt 转换字符串

如果是 NaN,则将结果变为 0

进行结果的最大最小值限制

/**

* @param

* str [string]

* @return

* [number] int

*/

var myAtoi = function(str) {

let num = parseInt(str);

if(isNaN(num)) {

num = 0;

}

let max = (2**31)-1,

min = -(2**31);

num = num > max ? max : num;

num = num < min ? min : num;

return num;

};

方法二 利用正则循环判断

思路:

先去空格

判断第一个字符是否是数字或者正负号,不是则返回 0

保存第一个字符串

循环字符串(从索引 1 开始),添加入结果字符中,遇到不是数字的跳出循环

如果第一个字符为正负号,且结果字符串为空,那么返回 0

否则,将正负号添加会结果字符串前面,并将结果字符串转化为数字

进行结果最大最小限制

返回结果数字

var myAtoi = function(str) {

str = str.trim();

let reg = /^[0-9-+]/,

max = (2**31)-1,

min = -(2**31)

if (!reg.test(str)) {

return 0;

}

let num = '',

c = str[0];

for (let i = 1; i < str.length;i++) {

if (!/[0-9]/.test(str[i])) {

break;

}

num += str[i];

}

if ((c === '-' ||c === '+') && num.length === 0) return 0;

num = (c + num)*1;

num = num < min ? min : num;

num = num > max ? max : num;

return num;

};

7 实现 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() 定义相符。

实现

方法一 JavaScript 字符串原生方法 indexOf

var strStr = function(haystack, needle) {

return haystack.indexOf(needle);

};

方法二 循环加 substr 抽取比较

思路:

如果 needle 为空字符串,则返回 0

循环 haystack 字符串,如果当前项与 needle 的第一项相等

从当前项开始,抽取 haystack 字符串中,needle 长度的字符串

让这个抽取的字符串与 needle 比较,相等则符合,返回当前索引

不符合则继续循环,循环结束,没有返回则返回 -1

var strStr = function(haystack, needle) {

if (needle === '') return 0;

for (let i = 0; i < haystack.length; i++) {

let item = haystack[i];

if (item === needle[0]) {

let str = haystack.substr(i, needle.length);

if (str === needle) return i;

}

}

return -1;

};

优化:由于符合的子串应当长度相等,所以,最初的循环只需要到 haystack 长度 - needle 长度 + 1 即可,后面的子串长度肯定小于 needle,不需要考虑了

var strStr = function(haystack, needle) {

if (needle === '') return 0;

for (let i = 0; i < haystack.length - needle.length + 1; i++) {

let item = haystack[i];

if (item === needle[0]) {

let str = haystack.substr(i, needle.length);

if (str === needle) return i;

}

}

return -1;

};

方法三 双循环

思路:

needle 为空字符串,返回 0

最笨的循环方式,循环 haystack,如果当前项与 needle 的第一项相等,则开始第二个循环

将 haystack 当前索引后面的字符与 needle 中的字符每个都进行比较,只要有一个不符合则退出循环

如果都符合,则返回当前索引

外层循环结束还是没有找到,则返回 -1

注意:这里提交,会显示时间超时,也就是两个字符串长度都很大的时候,两层循环,运行时间指数增长。

所以,为了减少循环次数,想到了上面方法中提到的优化,上面的方法也可以使用。优化后,代码运行时间就相当的可观了

var strStr = function(haystack, needle){

if (needle === '') return 0;

for (let i = 0; i < haystack.length-needle.length+1; i++) {

let item = haystack[i];

if (item === needle[0]) {

let j = i+1,

k = 1,

flag = true;

while (k < needle.length) {

if (haystack[j] !== needle[k]) {

flag = false;

break;

}

j++;

k++;

}

if (!flag) continue;

return i;

}

}

return -1;

};

8 报数

描述

报数序列是指一个按照其中的整数的顺序进数序列,按行报数,得到下一个数。其前五项如下:

1. 1

2. 11

3. 21

4. 1211

5. 111221

1 被读作  "one 1"  ("一个一") , 即 11。

11 被读作 "two 1" ("两个一"), 即 21。

21 被读作 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211。

给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。

注意:整数顺序将表示为一个字符串。

示例 1:

输入: 1

输出: "1"

示例 2:

输入: 4

输出: "1211"

实现

方法一 利用正则以及替换

思路:

初始字符串为 '1',那么后面循环次数应当是 n - 1

正则匹配所有连续的数字:/1+|2+|3+|4+|5+|6+|7+|8+|9+/g

把匹配的字符替换为长度加这个数字

循环完成后返回最后的字符串

/**

* @param

* n [number] number of times

* @return

* [string] item n string

*/

var countAndSay = function(n){

let str = '1';

let i = 1;

let reg = /1+|2+|3+|4+|5+|6+|7+|8+|9+/g;

while (i < n) {

str = str.replace(reg, function(str){

let s = str.length + str[0];

return s;

})

i++;

}

return str;

};

9 最长公共前缀

描述

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入: ["flower","flow","flight"]

输出: "fl"

示例 2:

输入: ["dog","racecar","car"]

输出: ""

解释: 输入不存在公共前缀。

说明:

所有输入只包含小写字母 a-z 。

实现

方法一 双循环

思路:

测试实例中存在空数组,所以需要增加判断,如果为空则返回空字符串

如果数组中只有一个字符串,则返回这个字符串,这一步可以提高性能

计算出字符串中最短的字符串的长度

从 0 开始循环最小长度,外层循环记录一个标记,方便退出外层循环,初始为 true

循环数组中的每一项(除了最后一项),将当前项与下一项的 外层循环的索引字符 做比较

如果相等,则继续循环,如果不相等,则将标记置为 false,退出里层循环

外层循环中,如果标记为 false,则退出外层循环,否则,这个字符为公共字符,添加入结果字符串中

最后返回结果字符串

/**

* @param

* strs [object] string array

* @return

* [string] common prefix

*/

var longestCommonPrefix = function(strs) {

if (strs.length === 0) return '';

if (strs.length === 1) return strs[0];

let result = '',

lengthAry = strs.map(item=>{

return item.length;

}),

n = Math.min.apply(Math, lengthAry);

for (let i = 0; i < n; i++) {

let flag = true;

for (let j = 0; j < strs.length-1; j++) {

let item = strs[j],

next = strs[j+1];

if (item[i] !== next[i]) {

flag = false;

break;

}

}

if (!flag) break;

result += strs[0][i];

}

return result;

};

10 旋转矩阵

描述

给定一个 n × n 的二维矩阵表示一个图像。

将图像顺时针旋转 90 度。

说明:

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

示例 1:

给定 matrix =

[

[1,2,3],

[4,5,6],

[7,8,9]

],

原地旋转输入矩阵,使其变为:

[

[7,4,1],

[8,5,2],

[9,6,3]

]

示例 2:

给定 matrix =

[

[ 5, 1, 9,11],

[ 2, 4, 8,10],

[13, 3, 6, 7],

[15,14,12,16]

],

原地旋转输入矩阵,使其变为:

[

[15,13, 2, 5],

[14, 3, 4, 1],

[12, 6, 8, 9],

[16, 7,10,11]

]

实现

方法一 分层交换

思路:

矩阵是一层一层往里的,比如 3*3 只有两层,里面一层是 1*1 的矩阵,4*4 有两层,里面一层是 2*2 的矩阵

每一层的交换都是 n-1 个数旋转交换位置

开始时,记录交换的开始和结束索引,每次循环开始索引加一,结束索引减一,直到两者相等或开始大于结束时退出循环,这样就是循环每一层,两者相等时是因为只有一个数,不用交换

每一层中,利用一个中间数组、三个变动的索引和两个不变(开始与结束)的索引,进行旋转交换

/**

* @param

* matrix [object] matrix array

* @return

* [void]

*/

var rotate = function(matrix) {

//=> 记录开始和结束索引

let start = 0,

end = matrix.length-1;

//=> 遍历每一层

while (start < end) {

// 中间数组

let ary = [];

// 三个变化的索引

let i = start,

j = end,

k = 0; // 这是中间数组需要的索引,可以不用

//=> 判断条件其实只需要其中一个达到条件即可,因为循环次数都是一样的

while (i < end && j > start) {

ary[k] = matrix[start][i];

matrix[start][i] = matrix[j][start];

matrix[j][start] = matrix[end][j];

matrix[end][j] = matrix[i][end];

matrix[i][end] = ary[k];

i++;

j--;

k++;

}

start++;

end--;

}

};

11 两数之和

描述

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

实现

方法一 双循环

思路:

循环数组,将每一项(除最后一项外)都与其后面的所有项比较

如果两项相加等于目标值,则将两项的索引添加进结果数组中,然后退出循环

最后返回结果数组,不存在则返回空数组

/**

* @param

* nums [object] nums Array

* target [number] target number

* @return {number[]}

*/

var twoSum = function(nums, target) {

let ary = [];

for (let i = 0; i < nums.length - 1; i++) {

for (let j = i + 1; j < nums.length; j++) {

if (nums[i] + nums[j] === target) {

ary.push(i);

ary.push(j);

break;

}

}

}

return ary;

};

如果需要返回所有相加等于目标值的索引组合,那么就把索引组合成一个数组再添加进结果数组中,并且不退出循环。但是这样的话就会对元素重复利用。

12 移动零

描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]

输出: [1,3,12,0,0]

说明:

必须在原数组上操作,不能拷贝额外的数组。

尽量减少操作次数。

实现

方法一 删除后再添加

思路:

循环数组,为了尽量减少数组塌陷带来的消耗,使用从后往前遍历

如果当前项为 0,则删除当前项,并记录删除的 0 的个数

循环结束后,删除了多少个 0,则在数组后面添加多少个 0

/**

* @param

* nums [object] nums Array

* @return

* [void]

*/

var moveZeroes = function(nums) {

let flag = 0;

for (let i = nums.length - 1; i >= 0; i--) {

let item = nums[i];

if (item === 0) {

nums.splice(i, 1); //=> 从后往前遍历,数组塌陷不会带来问题

flag++;

}

}

for (let i = 0; i < flag; i++) {

nums.push(0);

}

};

方法二 优化删除后再添加

思路:

这里由于是从后往前遍历,可以循环结束后添加,也可以每次删除后添加

每次删除后添加,这样就可以减少后面的循环消耗,也不需要记录了

var moveZeroes = function(nums) {

for (let i = nums.length - 1; i >= 0; i--) {

let item = nums[i];

if (item === 0) {

nums.splice(i, 1); //=> 从后往前遍历,数组塌陷不会带来问题

nums.push(0);

}

}

};

方法三 循环交换位置

思路:

循环数组,从后往前遍历

当前项为 0,则让其与后面所有的不为 0 的数都交换位置

这里判断与不为 0 的数交换,也是为了减少操作,从后往前遍历才能实现

var moveZeroes = function(nums) {

for (let i = nums.length - 1; i >= 0; i--) {

let item = nums[i];

if (item === 0) {

for (let j = i; j < nums.length-1; j++) {

let temp = null;

if (nums[j+1] === 0) {

break;

} else {

temp = nums[j+1];

nums[j+1] = nums[j];

nums[j] = temp;

}

}

}

}

};

13 两个数组的交集 II

描述

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]

输出: [2,2]

示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]

输出: [4,9]

说明:

输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。

我们可以不考虑输出结果的顺序。

进阶:

如果给定的数组已经排好序呢?你将如何优化你的算法?

如果 nums1 的大小比 nums2 小很多,哪种方法更优?

如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

实现

方法一 循环测试是否存在,存在则删除

思路:

先克隆一份需要操作的 nums2 数组

循环 nums1 数组

如果当前项在克隆的数组中已经存在,那么把当前项加入结果数组中,删除克隆数组中查找到的值(防止重复查找)

/**

* @param

* nums1 [object] nums1 Array

* nums2 [object] nums2 Array

* @return

* [Array]

*/

var intersect = function(nums1, nums2){

let ary = [...nums2],

result = [];

nums1.forEach(item=>{

let index = ary.indexOf(item);

if (index !== -1) {

ary.splice(index,1);

result.push(item);

}

})

return result;

};

正负号 substr java_实战LeetCode 系列(一) (题目+解析)相关推荐

  1. 1、【WebGIS实战】系列介绍

    大家好,我是X北辰北.本文是「WebGIS实战」系列,关注这个标签,阅读所有文章,成为WebGIS开发高手. 此系列文章打算通过一周的时间带领大家入门WebGIS开发,不管你是0基础同学还是之前有一些 ...

  2. leetcode系列-93.复原 IP 地址

    leetcode系列–第93题.复原 IP 地址 题目描述:有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔.例如:" ...

  3. leetcode系列-131.分割字符串

    leetcode系列–第131题.分割字符串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 .返回 s 所有可能的分割方案.回文串 是正着读和反着读都一样的字符串. 输入:s ...

  4. leetcode系列--13.罗马数字转整数

    leetcode系列–第13题.罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M.字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 ...

  5. leetcode系列--5.最长回文字串

    leetcode系列–第5题.最长回文字串 给你一个字符串 s,找到 s 中最长的回文子串. 子串和子序列的区别: 子串:子串是指一个字串中连续的字串 子序列:子序列是指一个字串中非连续的字串 输入: ...

  6. 【C语言】从键盘任意输入一个3位整数,编程计算并输出它的逆序数(忽略整数前的正负号)。

    C语言实战题目:从键盘任意输入一个3位整数,编程计算并输出它的逆序数(忽略整数前的正负号).例如,输入-123,则忽略负号,由123分离出其百位1.十位2.个位3,然后计算3*100+2*10+1 = ...

  7. java 正负号数值比较_从零学java笔录-第10篇 数据类型(四)

    从零学java笔录-第10篇 数据类型(四) 凯哥Java 凯哥java 本文是<凯哥陪你学系列之java基础篇> 感谢: 感谢网友:志远162.在上一篇中对错误指出. 在上篇中模运算正负 ...

  8. 【WEB API项目实战干货系列】- API登录与身份验证(三)

    上一篇: [WEB API项目实战干货系列]- 接口文档与在线测试(二) 这篇我们主要来介绍我们如何在API项目中完成API的登录及身份认证. 所以这篇会分为两部分, 登录API, API身份验证. ...

  9. Action Golf 四个魔法球实战训练系列_huatuo_新浪博客

    Action & Golf 四个魔法球实战训练系列_huatuo_新浪博客

最新文章

  1. 日志——Vue.js开发在线简历生成器
  2. 华工智能车队--这里有一群热爱智能车的人
  3. 更改mssqlserver的表的编码格式_Excel格式全揭秘,赶紧收藏起来吧
  4. Simulink之绝缘栅双极型晶体管(IGBT)
  5. TF使用例子-情感分类
  6. Asp.NET的DESAES加密算法(转载)
  7. byte数组添加数据_C#基于S7协议实现对PLC中DB块字节数据的获取及自定义textbox实现数据解析...
  8. CF Round#436 div2
  9. sql 左联接 全联接_学习SQL:联接多个表
  10. WEB前端、后端的说明
  11. Admob的PIN码接收教程
  12. win11怎么进安全模式,win11进入安全模式的方法
  13. sqlite3:sqlite3_column 函数
  14. Linux PHP开发环境:CentOS下配置LAMP开发环境
  15. windows 删除服务_哪些Windows 10 系统服务可以安全禁用?
  16. 11月20日云栖精选夜读:围观阿里总部:边喝茶边搞技术是一种怎样的体验?
  17. 【阿里云OSS对象存储搭配CDN加速使用】
  18. ASP.NET4.0中 ValidateRequest=false失效
  19. 图卷积神经网络4-空域卷积:空域卷积局限性分析和过平滑解决方案
  20. IT外企那点儿事(18): 当“we are a team”成为口头禅

热门文章

  1. 思科cisco交换机如何查找环路及解决方法
  2. 怎么生成永久二维码?怎么做出长期有效的图片二维码?
  3. Mezzanine学习---使用自定义模板
  4. 2021银4 各大厂前端面试题分享
  5. eNSP-配置单臂路由与静态路由实验
  6. 每个程序员都应该读的非编程书
  7. SmartForms 取消Word编辑器 恢复文本编辑器
  8. “91系列”资源网凉了,500余网站被封杀!
  9. 织梦Dedecms主要文件夹目录及模板文件说明
  10. python3读取excel汉字_从excel文件python3读取汉字