本系列通过JavaKotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~

阿俊带你用Kotlin刷算法(一)

阿俊带你用Kotlin刷算法(二)

项目的GitHub:Algorithm

寻找两个正序数组的中位数(Median of Two Sorted Arrays)

难度:困难

链接:Median of Two Sorted Arrays

代码

Java

/*** Created by TanJiaJun on 2021/6/9.* 4. 寻找两个正序数组的中位数(Median of Two Sorted Arrays)* 难度:困难** @see <a href="https://leetcode-cn.com/problems/median-of-two-sorted-arrays/">Median of Two Sorted Arrays</a>*/
class MedianOfTwoSortedArrays {public static void main(String[] args) {// 示例一System.out.println("示例一:");int[] firstNumbers = {1, 3};int[] secondNumbers = {2};System.out.println(findMedianSortedArrays(firstNumbers, secondNumbers));System.out.print("\n");// 示例二System.out.println("示例二:");int[] thirdNumbers = {1, 2};int[] fourthNumbers = {3, 4};System.out.println(findMedianSortedArrays(thirdNumbers, fourthNumbers));System.out.print("\n");// 示例三System.out.println("示例三:");int[] fifthNumbers = {0, 0};int[] sixthNumbers = {0, 0};System.out.println(findMedianSortedArrays(fifthNumbers, sixthNumbers));System.out.print("\n");// 示例四System.out.println("示例四:");int[] seventhNumbers = {};int[] eightNumbers = {1};System.out.println(findMedianSortedArrays(seventhNumbers, eightNumbers));System.out.print("\n");// 示例五System.out.println("示例五:");int[] ninthNumbers = {2};int[] tenthNumbers = {};System.out.println(findMedianSortedArrays(ninthNumbers, tenthNumbers));}/*** 双指针* 时间复杂度:O(m+n),其中m是数组num1的长度,n是数组num2的长度* 空间复杂度:O(m+n),其中m是数组num1的长度,n是数组num2的长度** @param firstNumbers  第一个数组* @param secondNumbers 第二个数组* @return 结果*/public static double findMedianSortedArrays(int[] firstNumbers, int[] secondNumbers) {int len1 = firstNumbers.length;int len2 = secondNumbers.length;// 合并后的数组的索引int index = 0;// 第一个数组的指针,下面用i指针描述int i = 0;// 第二个数组的指针,下面用j指针描述int j = 0;// 合并两个数组// 创建一个大小是两个数组长度之和的数组int[] arrays = new int[len1 + len2];while (i < len1 || j < len2) {if (i == len1) {// 如果第一个数组遍历完毕后,就继续遍历第二个数组arrays[index++] = secondNumbers[j++];} else if (j == len2) {// 如果第二个数组遍历完毕后,就继续遍历第一个数组arrays[index++] = firstNumbers[i++];} else if (firstNumbers[i] < secondNumbers[j]) {// 如果第一个数组的元素小于第二个数组的元素,就将第一个数组中的该元素添加到合并后的新数组,同时将i指针向右移动一格arrays[index++] = firstNumbers[i++];} else {// 如果第一个数组的元素大于第二个数组的元素,就将第二个数组中的该元素添加到合并后的新数组,同时将j指针向右移动一格arrays[index++] = secondNumbers[j++];}}// 找出数组的中位数double median;int length = arrays.length;if (length % 2 == 0) {// 如果数组长度是偶数,就找出这条中线旁边的两个元素,然后相加之后除以2得到结果median = (arrays[length / 2] + arrays[length / 2 - 1]) / 2.0D;} else {// 如果数组长度是奇数,就找出这条中线对应的元素,该元素就是结果median = arrays[length / 2];}return median;}}

Kotlin

/*** Created by TanJiaJun on 2021/6/13.* 4. 寻找两个正序数组的中位数(Median of Two Sorted Arrays)* 难度:困难** @see <a href="https://leetcode-cn.com/problems/median-of-two-sorted-arrays/">Median of Two Sorted Arrays</a>*/
object MedianOfTwoSortedArraysKotlin {@JvmStaticfun main(args: Array<String>) {// 示例一println("示例一:")val firstNumbers = intArrayOf(1, 3)val secondNumbers = intArrayOf(2)println(findMedianSortedArrays(firstNumbers, secondNumbers))print("\n")// 示例二println("示例二:")val thirdNumbers = intArrayOf(1, 2)val fourthNumbers = intArrayOf(3, 4)println(findMedianSortedArrays(thirdNumbers, fourthNumbers))print("\n")// 示例三println("示例三:")val fifthNumbers = intArrayOf(0, 0)val sixthNumbers = intArrayOf(0, 0)println(findMedianSortedArrays(fifthNumbers, sixthNumbers))print("\n")// 示例四println("示例四:")val seventhNumbers = intArrayOf()val eightNumbers = intArrayOf(1)println(findMedianSortedArrays(seventhNumbers, eightNumbers))print("\n")// 示例五println("示例五:")val ninthNumbers = intArrayOf(2)val tenthNumbers = intArrayOf()println(findMedianSortedArrays(ninthNumbers, tenthNumbers))}/*** 双指针* 时间复杂度:O(m+n),其中m是数组num1的长度,n是数组num2的长度* 空间复杂度:O(m+n),其中m是数组num1的长度,n是数组num2的长度** @param nums1 第一个数组* @param nums2 第二个数组* @return 结果*/private fun findMedianSortedArrays(nums1: IntArray, nums2: IntArray): Double {val size1 = nums1.sizeval size2 = nums2.size// 合并后的数组的索引var index = 0// 第一个数组的指针,下面用i指针描述var i = 0// 第二个数组的指针,下面用j指针描述var j = 0// 合并两个数组// 创建一个大小是两个数组长度之和的数组val arrays = IntArray(size1 + size2)while (i < size1 || j < size2) {when {// 如果第一个数组遍历完毕后,就继续遍历第二个数组i == size1 -> arrays[index++] = nums2[j++]// 如果第二个数组遍历完毕后,就继续遍历第一个数组j == size2 -> arrays[index++] = nums1[i++]// 如果第一个数组的元素小于第二个数组的元素,就将第一个数组中的该元素添加到合并后的新数组,同时将i指针向右移动一格nums1[i] < nums2[j] -> arrays[index++] = nums1[i++]// 如果第一个数组的元素大于第二个数组的元素,就将第二个数组中的该元素添加到合并后的新数组,同时将j指针向右移动一格else -> arrays[index++] = nums2[j++]}}// 找出数组的中位数val size = arrays.sizereturn if (size % 2.0 == 0.0) {// 如果数组长度是偶数,就找出这条中线旁边的两个元素,然后相加之后除以2得到结果(arrays[size / 2] + arrays[size / 2 - 1]) / 2.0} else {// 如果数组长度是奇数,就找出这条中线对应的元素,该元素就是结果arrays[size / 2].toDouble()}}
}

时间复杂度:O(m+n),其中m是数组num1的长度,n是数组num2的长度。

空间复杂度:O(m+n),其中m是数组num1的长度,n是数组num2的长度。

题解

根据题目可知,这两个数组都是正序(从小到大)的,所以我们可以先使用双指针将这两个数组合并成一个数组,注释写得挺详细了,这里就不在赘述了,合并后得到一个大小是两个数组长度之和的新数组,然后我们从这个数组找出中位数,有两种情况:

  • 如果数组长度是偶数,就找出这条中线旁边的两个元素,然后相加之后除以2得到结果。
  • 如果数组长度是奇数,就找出这条中线对应的元素,该元素就是结果。

最长回文子串(Longest Palindromic Substring)

难度:中等

链接:Longest Palindromic Substring

代码

Java

/*** Created by TanJiaJun on 2021/6/10.* 5. 最长回文子串(Longest Palindromic Substring)* 难度:中等** @see <a href="https://leetcode-cn.com/problems/longest-palindromic-substring/">Longest Palindromic Substring</a>*/
class LongestPalindromicSubstring {public static void main(String[] args) {// 示例一System.out.print("示例一:");String firstStr = "babad";System.out.println(expandAroundCenterLongestPalindrome(firstStr));System.out.print("\n");// 示例二System.out.print("示例二:");String secondStr = "cbbd";System.out.println(expandAroundCenterLongestPalindrome(secondStr));System.out.print("\n");// 示例三System.out.print("示例三:");String thirdStr = "a";System.out.println(expandAroundCenterLongestPalindrome(thirdStr));System.out.print("\n");// 示例四System.out.print("示例四:");String fourthStr = "ac";System.out.println(expandAroundCenterLongestPalindrome(fourthStr));}/*** 方法一:枚举算法* 时间复杂度:O(N^3),其中N是字符串的长度* 空间复杂度:O(1)** @param str 字符串* @return 结果*/private static String longestPalindrome(String str) {int maxLength = 0;String result = "";// 枚举所有的元素for (int i = 0, iLen = str.length(); i < iLen; i++) {for (int j = i + 1, jLen = str.length(); j <= jLen; j++) {String substring = str.substring(i, j);if (isPalindromeSubstring(substring) && substring.length() > maxLength) {maxLength = substring.length();result = substring;}}}return result;}/*** 判断字符串是否为回文串** @param str 字符串* @return 结果*/private static boolean isPalindromeSubstring(String str) {int length = str.length();for (int i = 0; i < length / 2; i++) {// 找出该元素作为回文子串的起始位置还有结束位置if (str.charAt(i) != str.charAt(length - i - 1)) {// 如果其中一个不相同,证明该字符串不是回文串return false;}}// 如果字符都相同,证明该字符串是回文串return true;}/*** 方法二:中心扩展法(双指针)* 时间复杂度:O(N^2),其中N是字符串的长度* 空间复杂度:O(1)** @param str 字符串* @return 结果*/private static String expandAroundCenterLongestPalindrome(String str) {int start = 0;int end = 0;for (int i = 0, length = str.length(); i < length; i++) {// 长度是奇数int oddLength = getExpandAroundCenterLength(str, i, i);// 长度是偶数int evenLength = getExpandAroundCenterLength(str, i, i + 1);// 得到最大长度int maxLength = Math.max(oddLength, evenLength);if (maxLength > end - start) {// 得到起始位置start = i - (maxLength - 1) / 2;// 得到结束位置end = i + maxLength / 2;}}// 截取对应的字符return str.substring(start, end + 1);}/*** 得到中心往两边扩展的长度** @param str   字符串* @param left  左指针* @param right 右指针* @return 长度*/private static int getExpandAroundCenterLength(String str, int left, int right) {// 找出该元素作为回文子串的起始位置还有结束位置while (left >= 0 && right < str.length() && str.charAt(left) == str.charAt(right)) {// 如果符合条件,左指针向左移动一格,右指针向右移动一格left--;right++;}// 得到长度return right - left - 1;}
}

Kotlin

import kotlin.math.max/*** Created by TanJiaJun on 2021/6/14.* 5. 最长回文子串(Longest Palindromic Substring)* 难度:中等** @see <a href="https://leetcode-cn.com/problems/longest-palindromic-substring/">Longest Palindromic Substring</a>*/
object LongestPalindromicSubstringKotlin {@JvmStaticfun main(args: Array<String>) {// 示例一print("示例一:")val firstStr = "babad"println(expandAroundCenterLongestPalindrome(firstStr))print("\n")// 示例二print("示例二:")val secondStr = "cbbd"println(expandAroundCenterLongestPalindrome(secondStr))print("\n")// 示例三print("示例三:")val thirdStr = "a"println(expandAroundCenterLongestPalindrome(thirdStr))print("\n")// 示例四print("示例四:")val fourthStr = "ac"println(expandAroundCenterLongestPalindrome(fourthStr))}/*** 方法一:枚举算法* 时间复杂度:O(N^3),其中N是字符串的长度* 空间复杂度:O(1)** @param str 字符串* @return 结果*/private fun longestPalindrome(str: String): String {var maxLength = 0var result = ""// 枚举所有的元素str.forEachIndexed { index, _ ->for (i in index + 1..str.length) {val substring = str.substring(index, i)if (isPalindromicSubstring(substring) && substring.length > maxLength) {maxLength = substring.lengthresult = substring}}}return result}/*** 判断字符串是否为回文串** @param str 字符串* @return 结果*/private fun isPalindromicSubstring(str: String): Boolean {val length = str.lengthfor (i in 0 until length / 2) {// 找出该元素作为回文子串的起始位置还有结束位置if (str[i] != str[length - i - 1]) {// 如果其中一个不相同,证明该字符串不是回文串return false}}// 如果字符都相同,证明该字符串是回文串return true}/*** 方法二:中心扩展法(双指针)* 时间复杂度:O(N^2),其中N是字符串的长度* 空间复杂度:O(1)** @param str 字符串* @return 结果*/private fun expandAroundCenterLongestPalindrome(str: String): String {var start = 0var end = 0str.forEachIndexed { index, _ ->// 长度是奇数val oddLength = getExpandAroundCenterLength(str = str, left = index, right = index)// 长度是偶数val evenLength = getExpandAroundCenterLength(str = str, left = index, right = index + 1)// 得到最大长度val maxLength = max(oddLength, evenLength)if (maxLength > end - start) {// 得到起始位置start = index - (maxLength - 1) / 2// 得到结束位置end = index + maxLength / 2}}return str.substring(start, end + 1)}/*** 得到中心往两边扩展的长度** @param str   字符串* @param left  左指针* @param right 右指针* @return 长度*/private fun getExpandAroundCenterLength(str: String, left: Int, right: Int): Int {var l = leftvar r = right// 找出该元素作为回文子串的起始位置还有结束位置while ((l >= 0 && r < str.length && str[l] == str[r])) {// 如果符合条件,左指针向左移动一格,右指针向右移动一格l--r++}// 得到长度return r - l - 1}}

题解

枚举

// LongestPalindromicSubstringKotlin.kt
/*** 方法一:枚举* 时间复杂度:O(N^3),其中N是字符串的长度* 空间复杂度:O(1)** @param str 字符串* @return 结果*/
private fun longestPalindrome(str: String): String {var maxLength = 0var result = ""// 枚举所有的元素str.forEachIndexed { index, _ ->for (i in index + 1..str.length) {val substring = str.substring(index, i)if (isPalindromicSubstring(substring) && substring.length > maxLength) {maxLength = substring.lengthresult = substring}}}return result
}/*** 判断字符串是否为回文串** @param str 字符串* @return 结果*/
private fun isPalindromicSubstring(str: String): Boolean {val length = str.lengthfor (i in 0 until length / 2) {// 找出该元素作为回文子串的起始位置还有结束位置if (str[i] != str[length - i - 1]) {// 如果其中一个不相同,证明该字符串不是回文串return false}}// 如果字符都相同,证明该字符串是回文串return true
}

时间复杂度:O(N^3),其中N是字符串的长度。

空间复杂度:O(1)。

暴力解法,枚举所有元素,要注意的是,由于回文串的特征是正读和反读都一样,例如:abba就是回文串abda就不是回文串了,所以我们只要找到某个字符,并且找到该字符对应索引的字符,只需要遍历该数组长度一半就可以判断该字符串是否为回文串,注释写得挺详细了,这里就不再赘述了。

中心扩展法(双指针)

// LongestPalindromicSubstringKotlin.kt
/*** 方法二:中心扩展法(双指针)* 时间复杂度:O(N^2),其中N是字符串的长度* 空间复杂度:O(1)** @param str 字符串* @return 结果*/
private fun expandAroundCenterLongestPalindrome(str: String): String {var start = 0var end = 0str.forEachIndexed { index, _ ->// 长度是奇数val oddLength = getExpandAroundCenterLength(str = str, left = index, right = index)// 长度是偶数val evenLength = getExpandAroundCenterLength(str = str, left = index, right = index + 1)// 得到最大长度val maxLength = max(oddLength, evenLength)if (maxLength > end - start) {// 得到起始位置start = index - (maxLength - 1) / 2// 得到结束位置end = index + maxLength / 2}}return str.substring(start, end + 1)
}/*** 得到中心往两边扩展的长度** @param str   字符串* @param left  左指针* @param right 右指针* @return 长度*/
private fun getExpandAroundCenterLength(str: String, left: Int, right: Int): Int {var l = leftvar r = right// 找出该元素作为回文子串的起始位置还有结束位置while ((l >= 0 && r < str.length && str[l] == str[r])) {// 如果符合条件,左指针向左移动一格,右指针向右移动一格l--r++}// 得到长度return r - l - 1
}

时间复杂度:O(N^2),其中N是字符串的长度。

空间复杂度:O(1)。

由于回文串的特征是正读和反读都一样,例如:abba就是回文串abda就不是回文串了,所以我们可以从该字符串的中间向两边扩展地遍历,这样就能快速地得到最长的回文子串,要注意的是,因为数组的长度可能是奇数,也可能是偶数,如果是奇数的话,中心点就只有一个;如果是偶数的话,中心点就有两个

Z字形变换(ZigZag Conversion)

难度:中等

链接:ZigZag Conversion

代码

Java

/*** Created by TanJiaJun on 2021/6/12.* 6. Z字形变换(ZigZag Conversion)* 难度:中等** @see <a href="https://leetcode-cn.com/problems/zigzag-conversion/">ZigZag Conversion</a>*/
class ZigZagConversion {public static void main(String[] args) {// 示例一System.out.print("示例一:");String firstStr = "PAYPALISHIRING";int firstNumRows = 3;System.out.println(convert(firstStr, firstNumRows));System.out.print("\n");// 示例二System.out.print("示例二:");String secondStr = "PAYPALISHIRING";int secondNumRows = 4;System.out.println(convert(secondStr, secondNumRows));System.out.print("\n");// 示例三System.out.print("示例三:");String thirdStr = "A";int thirdNumRows = 1;System.out.println(convert(thirdStr, thirdNumRows));}/*** 时间复杂度:O(N),其中N是字符串的长度* 空间复杂度:O(N)** @param str     字符串* @param numRows 行数* @return 结果*/private static String convert(String str, int numRows) {if (numRows == 1) {// 如果只是一行的话,就直接返回该字符串return str;}// 创建长度是行数的StringBuilder数组,并且每个元素都创建StringBuilder对象StringBuilder[] stringBuilders = new StringBuilder[numRows];for (int i = 0; i < numRows; i++) {stringBuilders[i] = new StringBuilder();}// 索引int index = 0;// 行数int row = 0;int length = str.length();while (index < length) {// 从第一行开始,按照行数添加到对应的数组,并且追加字符,然后一直遍历到最后一行对应的数组while (index < length && row < numRows) {char ch = str.charAt(index++);stringBuilders[row++].append(ch);}// 此时row是最后一行,所以我们需要回到倒数第二行,执行以下逻辑row = numRows - 2;// 从倒数第二行开始,按照行数添加到对应的数组,并且追加字符,然后一直遍历到第一行的对应的数组while (index < length && row >= 0) {char ch = str.charAt(index++);stringBuilders[row--].append(ch);}// 此时row是-1,所以我们需要回到第二行,执行以下逻辑row += 2;}// 创建一个新的StringBuilder,将每一行对应的StringBuilder数组对应的StringBuilder追加到这个对象StringBuilder resultSB = new StringBuilder();for (StringBuilder stringBuilder : stringBuilders) {resultSB.append(stringBuilder);}// 将这个StringBuilder转成字符串return resultSB.toString();}}

Kotlin

/*** Created by TanJiaJun on 2021/6/14.* 6. Z字形变换(ZigZag Conversion)* 难度:中等** @see <a href="https://leetcode-cn.com/problems/zigzag-conversion/">ZigZag Conversion</a>*/
object ZigZagConversionKotlin {@JvmStaticfun main(args: Array<String>) {// 示例一print("示例一:")val firstStr = "PAYPALISHIRING"val firstNumRows = 3println(convert(firstStr, firstNumRows))print("\n")// 示例二print("示例二:")val secondStr = "PAYPALISHIRING"val secondNumRows = 4println(convert(secondStr, secondNumRows))print("\n")// 示例三print("示例三:")val thirdStr = "A"val thirdNumRows = 1println(convert(thirdStr, thirdNumRows))}/*** 时间复杂度:O(N),其中N是字符串的长度* 空间复杂度:O(N)** @param str     字符串* @param numRows 行数* @return 结果*/private fun convert(str: String, numRows: Int): String {if (numRows == 1) {// 如果只是一行的话,就直接返回该字符串return str}// 创建长度是行数的StringBuilder数组,并且每个元素都创建StringBuilder对象val stringBuilders = Array(numRows, init = { StringBuilder() })// 索引var index = 0// 行数var row = 0val length = str.lengthwhile (index < length) {// 从第一行开始,按照行数添加到对应的数组,并且追加字符,然后一直遍历到最后一行对应的数组while (index < length && row < numRows) {stringBuilders[row++].append(str[index++])}// 此时row是最后一行,所以我们需要回到倒数第二行,执行以下逻辑row = numRows - 2// 从倒数第二行开始,按照行数添加到对应的数组,并且追加字符,然后一直遍历到第一行的对应的数组while (index < length && row >= 0) {stringBuilders[row--].append(str[index++])}// 此时row是-1,所以我们需要回到第二行,执行以下逻辑row += 2}// 创建一个新的StringBuilder,将每一行对应的StringBuilder数组对应的StringBuilder追加到这个对象val resultSB = StringBuilder()stringBuilders.forEach { resultSB.append(it) }// 将这个StringBuilder转成字符串return resultSB.toString()}}

时间复杂度:O(N),其中N是字符串的长度。

空间复杂度:O(N)。

题解

根据题目我们可以知道,字符串是按着反向N字形排列的,我们可以先创建一个长度是行数StringBuilder数组,然后定义一个row这样的指针来确定行数,为了方便理解,我举个例子,假设字符串PAYPALISHIRING,行数是3,我们从第一行开始,按照行数将字符添加到对应的数组,并且追加字符,然后一直遍历到最后一行对应的数组,此时这三个数组的情况如下所示:

  • 第一个数组:P
  • 第二个数组:A
  • 第三个数组:Y

此时的row的值是4,然后这个时候根据题目要求,我们的指针要回到倒数第二行,所以我们就要将row的值调整为行数减去2,也就是3-2等于1,然后开始继续遍历,此时这三个数组的情况如下所示:

  • 第一个数组:P
  • 第二个数组:A、P
  • 第三个数组:Y

然后我们的指针要从倒数第二行开始,按照行数添加到对应的数组,并且追加字符,然后一直遍历到第一行的对应的数组,此时这三个数组的情况如下所示:

  • 第一个数组:P、A
  • 第二个数组:A、P、L
  • 第三个数组:Y、I

此时row的值是**-1**,最后根据题目要求,我们的指针row要回到第二行,所以我们就要将row的值调整为自增2,也就是**-1+2等于1**,然后开始继续遍历,此时这三个数组的情况如下所示:

  • 第一个数组:P、A
  • 第二个数组:A、P、L、S
  • 第三个数组:Y、I

以此类推遍历下去,后面的逻辑就跟前面的逻辑一样了,这里就不再赘述了。

最后将这个StringBuilder数组遍历后追加到一个新的StringBuilder对象,然后转成字符串就可以得到最后的结果了。

我的GitHub:TanJiaJunBeyond

Android通用框架:Android通用框架

我的掘金:谭嘉俊

我的简书:谭嘉俊

我的CSDN:谭嘉俊

阿俊带你用Kotlin刷算法(二)相关推荐

  1. 阿俊带你用Kotlin刷算法(四)

    本系列通过Java和Kotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~ 阿俊带你用Kotlin刷算法(一) 阿俊带你用Kotli ...

  2. 阿俊带你用Kotlin刷算法(一)

    本系列通过Java和Kotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~ 阿俊带你用Kotlin刷算法(一) 阿俊带你用Kotli ...

  3. 阿俊带你用Kotlin刷算法(三)

    本系列通过Java和Kotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~ 阿俊带你用Kotlin刷算法(一) 阿俊带你用Kotli ...

  4. 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)

    这篇文章为本专栏所有力扣题目提供目录链接, 更加方便读者根据题型或面试频率进行阅读, 此外也会介绍我在刷题过程中总结的刷算法题目的顺序/注意点/技巧, 最后说下文中出现的思维导图源文件的问题 和 打卡 ...

  5. 刷算法的时候有没有必要自写测试用例?

    # 问题详述 刷算法的时候,我们是不是可以只是设计出算法,不写测试用例,直接用别人的数据集去测试就行了?换句话说,我们有没有必要自己写测试用例? # 个人看法 有,十分必要. # 测试用例可以促进工程 ...

  6. 5分钟带你理解一致性Hash算法

    转载自 5分钟带你理解一致性Hash算法 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot s ...

  7. 求带权中位数的Select算法

    2019独角兽企业重金招聘Python工程师标准>>> 求带权中位数的Select算法 设有一个数组a,元素类型为T,T的定义如下: struct T { int x: // 位置 ...

  8. 公式太多,读不懂? 一文带你领略KNN近邻算法~简单易懂

    ↑ 点击上方[计算机视觉联盟]关注我们 K近邻算法采用测量不同特征值之间的距离方法进行分类. K-近邻算法工作原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知 ...

  9. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

最新文章

  1. win10 输入法不见了、繁体 问题解决
  2. Linux入门基础分享[一]
  3. 排序算法基本介绍及python实现(含详细注释)
  4. IntelliJ IDEA 2021连接MySql数据库的操作
  5. 程序员面试金典——4.3高度最小的BST
  6. 阿里副总裁、达摩院自动驾驶负责人王刚离职!
  7. nfc卡模式与标准模式_NFC是什么?有什么优势和劣势?
  8. steam怎么共享计算机游戏,steam怎么共享游戏给好友?steam向好友共享游戏教程
  9. 获取微信公众号文章内容
  10. vue-router中重定向和别名
  11. 宁波跨境海关商品订单推送清关及支付宝海关报关
  12. java中的各种架构
  13. 清楚浮动四种常用方法
  14. 常见的html转义字符
  15. NVIDIA英伟达jetson xavier nx怎么进入Recovery模式
  16. 在线编辑php文件的代码
  17. SQL Server 表分区之水平表分区
  18. VsCode 语音注释, 让信息更丰富 (上)
  19. 商旅服务平台的会员制规划与运营
  20. PowerBuilder(pb)真的弱吗?还是你不会?PB项目二次开发、系统的维护、兼职业务

热门文章

  1. ESL4.3 线性判别分析(LDAQDA)学习笔记
  2. php 生成条形码(支持任意php框架)
  3. CPU/GPU/GPGPU简介
  4. HTTP500内部服务器错误
  5. python编写程序,生成包含 20 个随机数的列表,然后将前 10 个元素升序排列,后 10 个元 素降序排列,并输出结果。
  6. 征途手游2新开区服务器维护多久,征途2手游新区开服表 征途2手游新区开服时间详解[图]...
  7. 数据结构—— 构造散列函数的六种方法【直接定址法-数字分析法-平方取中法-折叠法-除留余数法-随机数法】
  8. HorizontalScrollview+recycleview实现横向滑动
  9. intellij idea中设置mybatis的xml配置文件的背景色
  10. 换一个地方也许国产WPS OFFICE 会重夺办公软件霸主!