class Solution {
public int[] sortedSquares(int[] arr) {
for(int i = 0; i < arr.length; i ){
for(int j=i 1;j<arr.length;j ){
arr[i]=arr[i]*arr[i];
arr[j]=arr[j]*arr[j];
if(arr[j]<arr[i]){
int temp=0;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
return arr;
}
}
你能告訴我哪里出錯了.. 對于輸入 [-4,-1,0,3,10] 輸出應該是 [0,1,9,16,100] ,我當前的輸出是 [0,1,43046721,0 ,1874919424] .. 我不想使用 Array.sort() 。想撰寫自己的代碼..你能幫我解決這個問題嗎?哪里出了問題。提前致謝
uj5u.com熱心網友回復:
您的排序回圈是有效的,但是您以累積的方式對每個條目進行 4 次平方。一種方法是首先對所有元素進行平方,然后排序。
從您的結果中,您可以看到證據:
(((3^2)^2)^2)^2 = 43046721
第二個 0 很有趣:
(((-4^2)^2)^2)^2 = 4,294,967,296
這對于 32 位 int 變為 0。
對于 10:
(((10^2)^2)^2)^2 = 10,000,000,000,000,000
滾動到 187491924。
因此,您的代碼可以通過首先對條目進行平方然后排序來簡單地更新:
public int[] sortedSquares(int[] arr) {
for (int i = 0; i < arr.length; i ) {
arr[i] = arr[i] * arr[i];
}
for(int i = 0; i < arr.length; i ){
for(int j=i 1;j<arr.length;j ){
if(arr[j]<arr[i]){
int temp=0;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
return arr;
}
uj5u.com熱心網友回復:
在排序程序中,您多次平方每個數字。我推薦以下解決方案,它仍然可以讓您僅使用嵌套回圈對平方值進行排序。但是您需要交換已排序的值和未排序的值以使它們保持同步。
public static int[] sortedSquares(int[] arr) {
for(int i = 0; i < arr.length-1; i ){
int t1 = arr[i]*arr[i];
for(int j=i 1;j<arr.length;j ){
int t2 = arr[j] * arr[j];
if(t1<t2){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
temp = t1;
t1 = t2;
t2 = temp;
}
}
arr[i] = t1; // now assign t1 to arr[i]. The first element will no
// longer be accessed so it won't taint the results.
}
return arr;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505915.html
