Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

สร้างตัวเลขที่น้อยที่สุดโดยใช้การสลับได้สูงสุดหนึ่งครั้งใน C++


ในปัญหานี้ เราได้รับจำนวนเต็มบวก ภารกิจของเราคือการสร้างโปรแกรมสร้างตัวเลขที่น้อยกว่าโดยใช้การสลับได้สูงสุดหนึ่งครั้ง

เราจะสร้างตัวเลขใหม่โดยใช้หลักของตัวเลขที่มีอยู่ ตัวเลขที่น้อยที่สุดที่สร้างได้สามารถมีได้เพียงหนึ่งหลักที่สลับจากตัวเลขที่มีอยู่

มาดูตัวอย่างเพื่อเข้าใจปัญหา

Input: n = 63519 Output: 36519

วิธีการแก้ปัญหา

วิธีหนึ่งในการแก้ปัญหาคือการหาตัวเลขทั้งหมดที่สร้างได้จากการสลับคู่ของหลักของตัวเลขที่กำหนด จากตัวเลขที่สลับหลักทั้งหมดนี้ ตัวเลขที่น้อยที่สุดจะถูกคืนค่า สำหรับนี้ เราจะแปลงตัวเลขเป็นสตริงและสลับตำแหน่ง

ตัวอย่าง

โปรแกรมสาธิตการทำงานของวิธีแก้ปัญหาของเรา

#include <iostream> using namespace std; int findSmallestNumSwapDig(int N){    string strNum = to_string(N);    string temp = strNum;    for (int i = 0; i < strNum.size(); i++) {       for (int j = i + 1; j < strNum.size(); j++) {          swap(strNum[i], strNum[j]);          if (stoi(strNum) < stoi(temp))             temp = strNum;          swap(strNum[i], strNum[j]);       }    }    return stoi(temp); } int main(){    int num = 792156;    cout<<"The number is "<<num<<endl;    cout<<"The smallest number created by swapping one digit is "<<findSmallestNumSwapDig(num) << endl;    return 0; }

เอาต์พุต

The number is 792156 The smallest number created by swapping one digit is192756

อีกวิธีหนึ่ง

อีกวิธีหนึ่งในการแก้ปัญหาคือการใช้อาร์เรย์ช่วย aux[] อาร์เรย์นี้ใช้เก็บดัชนีของหลักที่น้อยที่สุดทางขวา (ดัชนีมากกว่า) ของดัชนีปัจจุบัน คือ aux[i] คือดัชนีของหลักที่น้อยที่สุดทางขวาของหลักตัวเลข เริ่มต้น aux[i] = -1 หากไม่มีหลักแบบนั้น ตอนนี้ เดินทางผ่านตัวเลขจากดัชนี 0 ถึง n-1 และหาตัวเลขในอาร์เรย์ aux[] ที่น้อยกว่าค่าปัจจุบัน สำหรับค่าดัชนี 0 ตรวจสอบองค์ประกอบที่ไม่เป็นศูนย์ หาก 0 เกิดขึ้น ตัดค่านั้นทิ้ง หากพบองค์ประกอบใด ให้สลับ arr[i] & arr[aux[i]] และคืนค่าตัวเลขที่สร้างขึ้น

ตัวอย่าง

โปรแกรมสาธิตการทำงานของวิธีแก้ปัญหาของเรา

#include <bits/stdc++.h> using namespace std; int findSmallestNumSwapDig(int N){    string num = to_string(N);    int n = num.size();    int auxArr[n], right;    auxArr[n - 1] = -1;    right = n - 1;    for (int i = n - 2; i >= 1; i--) {       if (num[i] >= num[right])          auxArr[i] = right;       else {          if (num[i] == num[i + 1])             auxArr[i] = right;          else {             auxArr[i] = -1;             right = i;          }       }    }    int small = -1;    for (int i = 1; i < n; i++)    if (num[i] != '0') {       if (small == -1) {          if (num[i] < num[0])             small = i;       }       else if (num[i] <= num[small])             small = i;    }    if (small != -1)       swap(num[0], num[small]);    else {       for (int i = 1; i < n; i++) {          if (auxArr[i] != -1 && num[i] != num[auxArr[i]]) {             swap(num[i], num[auxArr[i]]);             break;          }       }    }    return stoi(num); } int main(){    int num = 792156;    cout<<"The number is "<<num<<endl;    cout<<"The smallest number created by swapping one digit is" <<findSmallestNumSwapDig(num)<< endl;       return 0; }

เอาต์พุต

The number is 792156 The smallest number created by swapping one digit is192756