โจทย์
ในบทช่วยสอนนี้ เราจะเขียนโปรแกรมหาตัวเลขที่มากที่สุดด้วยการสลับครั้งเดียวซึ่งน้อยกว่าตัวเลข n ที่กำหนด
มาดูขั้นตอนการแก้ปัญหา
- กำหนดตัวเลข n
- วนลูปจากท้ายสตริงและหาดัชนีของหลักที่มากกว่าหลักถัดไป เก็บไว้ในตัวแปร
- หยุดลูปทันทีที่เจอ
- วนลูปผ่านตัวเลขจากท้ายสตริงไปยังดัชนีข้างต้น
- หาดัชนีของหลักที่น้อยกว่าหลักที่ดัชนีข้างต้นและมากที่สุดในพื้นที่นั้น
- สลับหลักที่สองดัชนีข้างต้น คืนค่าตัวเลขที่อัปเดตแล้ว
ตัวอย่าง
มาดูโค้ดกัน
#include <bits/stdc++.h>
using namespace std;
string getTheNumber(string str) {
int length = str.length();
int index = -1;
for (int i = length - 2; i >= 0; i--) {
if (str[i] > str[i+1]) {
index = i;
break;
}
}
int smallerDigitIndex = -1;
for (int i = length - 1; i > index; i--) {
if (str[i] < str[index]) {
if (smallerDigitIndex == -1 || str[i] >= str[smallerDigitIndex]) {
smallerDigitIndex = i;
}
}
}
if (index == -1) {
return "-1";
}
if (smallerDigitIndex != -1) {
swap(str[index], str[smallerDigitIndex]);
return str;
}
return "-1";
}
int main() {
string str = "54624";
cout << getTheNumber(str) << endl;
return 0;
}
ผลลัพธ์
หากคุณรันโค้ดข้างต้น คุณจะได้ผลลัพธ์ดังนี้
54426
สรุป
หากคุณมีคำถามในบทช่วยสอนนี้ ให้กล่าวถึงในส่วนความคิดเห็น