我正在做一些编码挑战,如果arr参数(数字数组)按升序排序,那么编写一个返回true的函数。我似乎无法弄清楚这一点,但我的代码,无论如何,总是返回真实。
function inAscOrder(arr) {
return arr.sort() === arr;
}
答案 0 :(得分:0)
您无需对数组进行排序以查看它是否已排序。只需要检查它是否已分类。
static boolean arraySortedOrNot(int arr[], int n)
{
// Array has one or no element
if (n == 0 || n == 1)
return true;
for (int i = 1; i < n; i++)
// Unsorted pair found
if (arr[i-1] > arr[i])
return false;
// No unsorted pair found
return true;
}
参考链接: https://www.geeksforgeeks.org/program-check-array-sorted-not-iterative-recursive/
答案 1 :(得分:0)
由于数组是一种可变数据类型,因此当您在其上调用sort方法时,arr
将被修改。
因此arr.sort()
将修改您的数组而不是仅返回已排序的数组。这就是为什么当你再次检查它是否等于arr
时,它将是相同的排序数组。
为了解决这个问题,我建议你将arr
复制到另一个数组并对其进行排序并进行测试。
答案 2 :(得分:0)
正如其他人所指出的,您的版本的一个主要问题是它使用了变异sort
。虽然您可以通过插入slice(0)
或其他类似的方法来克隆数组,然后编写索引索引相等测试程序来解决这个问题,但是简单地测试每个连续条目是否大于前一个条目要容易得多。
也许最优雅的方法是通过递归。这是一个例子:
const inAscOrder = (a) => a.length < 2 || (a[0] < a[1] && inAscOrder(a.slice(1)))
由于Javascript的递归深度限制,这可能对大型数组不起作用。但同一事物的迭代版本相当简单:
const inAscOrder = (a) => {
if (a.length < 2) {return true}
for (let i = 1; i < a.length; i++) {
if (a[i -1] > a[i]) {return false}
}
return true
}