今天想试试chatgpt关于代码算法这一块儿是否好用。
判断质数
上面的代码有一点小问题,当num为2时,返回的结果是错误的,我改进了一下,并优化了一点性能
// 判断是否是素数(质数)
function isprime(number) {
// 所有的负数,0,1都不是素数
if (number <= 1) {
return false;
}
// 素数总满足 6x + 1 或者 6x + 5, 除了3和2,因此反过来就可以排除掉不是素数的值
if (number % 6 !== 1 && number % 6 !== 5 && number >= 5) {
return false;
}
// 如果不是素数,那么一定有一个因数小于等于sqrt(number),一个因数大于等于sqrt(number),因此我们遍历判断就不必从1到number
for (let i = 2; i < Math.sqrt(number) + 1; i++) {
if (number % i === 0 && number !== 2) {
return false;
}
}
return true;
}
计算数的阶数
我改成了尾递归的方式
function factorial(number, acc = 1) {
if (number <= 1) {
return acc;
}
return factorial(number - 1, acc * number);
}
找出字符串出现最多的字符
看起来挺好,但没有考虑当两个字符串出现次数一样时,还有当字符串为空时的处理
// 返回一个字符串中出现字数最多的字符。
function mostChartFromString(string) {
if (!string) {
return "";
}
const object = {};
let max = 0;
let result = [];
for (let char of string) {
if (!object[char]) {
object[char] = 1;
} else {
object[char] += 1;
}
if (object[char] > max) {
max = object[char];
result = [char];
} else if (object[char] === max) {
result.push(char);
}
}
if (result.length === 1) {
return result[0];
} else {
return result;
}
}
转置矩阵
下面是我写的,但chatgpt更简洁一些。
// 转置矩阵 将二维数组的行变为列,将列变为行
function transposeMatrix(array) {
// 行的数量就是二维数组中数组的数量
const numberRows = array.length;
// 列的数量则是二维数组中子数组的元素数量
const numberCols = array[0].length;
const newArray = [];
// 之前有多少列,现在就构建多少个数组push到新数组中
for (let i = 0; i <= numberCols - 1; i++) {
const childArray = [];
for (let j = 0; j <= numberRows - 1; j++) {
// 新数组的第i行,就拿取旧数组每一行的第i列
childArray.push(array[j][i]);
}
newArray.push(childArray);
}
return newArray;
}
实现一个函数 接受一个整数数组和一个目标整数,返回数组中两个数的下标,使得这两个数的和等于目标整数,例如:twoSum([2, 7, 11, 15], 9) 应该返回 [0, 1]。
我实现的方式和chargpt略有不同,我是通过两个相加等于目标数,chatgpt是用目标数去减,然后再在数组中检查是否能找到差,但chatgpt只能返回找到的第一组。
function twoSum(array, count) {
const result = [];
for (let i = 0; i < array.length; i++) {
for (let j = i + 1; j < array.length; j++) {
if (array[i] + array[j] === count) {
result.push([i, j]);
}
}
}
if(result.length <= 1) {
return result[0]
} else {
return result
}
}
实现一个函数,接受一个二叉树的根节点作为输入,返回该二叉树的深度
chatgpt给出的代码没毛病,
function maxDepth(root) {
if (!root) {
return 0;
}
const leftDepth = maxDepth(root.left);
const rightDepth = maxDepth(root.right);
return Math.max(leftDepth, rightDepth) + 1;
}
总结
chatgpt返回的代码质量的确挺高,在开发过程中,可以直接让它提供代码示例或者demo,开发工程师只需要按照项目的具体要求对其进行改造即可,是一个不错的开发者助理。
也许未来chatgpt代码构建能力会远超人类。