我正在處理作業,這需要找到第N-th 個單調數(一個數字形成遞增或遞減序列的數字)。
找到從零開始的第
N-個單調數0(即索引N從零開始,零是第一個單調數)。如果所有數字都按遞增或遞減順序排列,則該數被認為是單調的。
注意:所有僅由一位或兩位數字組成的數字都被認為是單調的。
例子:
單調數:
1234, 4321, 13579非單調數:
1432, 89461不允許使用Array 或
String.
我了解如何迭代數字的數字,但我不知道如何將其與檢查數字是否單調相結合。
這是我到目前為止的代碼:
static int functionForCountNumbers(){
int n = ReadNumber();
int min;
int count = 0;
while (n > 0){
min = n % 10;
n /= 10;
count = 1;
}
return count;
}
uj5u.com熱心網友回復:
這個問題可以分為兩部分,您可以分別解決:
生成候選編號。
檢查數字是否為單調數字。
為了完成第一部分,像您一樣宣告表示單調數字索引的計數器變數,以及保存候選數字值的變數。
然后在回圈中,您需要檢查每個候選數字,如果它是單調數字,則增加計數。
由于根據問題描述,所有包含一位或兩位數字的數字都被認為是單調的,我們可以將它們分開處理,并從第一個單調三位數字n<100開始檢查數字。123
注意:為簡單起見,我將堅持將單調數定義為嚴格遞增或遞減。我建議您咨詢您的教授,因為考慮所有兩位數的要求,包括包含重復數字的數字33,99可能意味著單調數可以包含相等的數字。所以,即使我的定義不準確,它也會讓你對演算法有所了解。
這就是第一部分的實作方式:
public static int functionForCountNumbers() {
int n = readNumber();
if (n < 0) throw new IllegalArgumentException("number shouldn't be negative");
// or allow the user to retry
// while (n < 0) {
// System.out.println("number shouldn't be negative");
// n = readNumber();
// }
if (n < 100) return n;
int count = 99;
int candidate = 123; // the first monotonic number, which should correspond to n = 100
while (count < n) {
if (isMonotonic(candidate)) count ;
candidate ;
}
return candidate;
}
要確定候選數字是否是單調的,您可以比較第一對后續數字并將結果存盤到變數中。然后繼續比較回圈中的其余數字,跟蹤前一個數字和上一個比較的結果。
如果在比較相鄰數字時沒有遇到不一致,則證明該數字是單調的。
這就是這個邏輯的樣子:
public static boolean isMonotonic(int num) {
if (num < 100) return true;
int prev = num % 10;
num /= 10;
boolean isIncreasing = isIncreasing(num % 10, prev);
while (num > 0) {
if (isIncreasing != isIncreasing(num % 10, prev)) {
return false;
}
prev = num % 10;
num /= 10;
}
return true;
}
public static boolean isIncreasing(int left, int right) {
return left <= right;
}
uj5u.com熱心網友回復:
記住第一對數字是遞增還是遞減。
記住最后一個數字。
對于每個新數字,檢查它是否與最后一個數字形成相同的順序。
將當前數字分配給最后一個數字
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/514868.html
標籤:爪哇算法
上一篇:C#中先前數字演算法的數字總和
