在給定數字中插入給定數字後,找到最小的數字


在給定數字中插入數字意味著在給定數字的前面、後面或中間新增一個新的給定數字。我們給定一個數字和一個數字,並必須以使所得新數字儘可能小的方式將該數字新增到數字中。我們將數字轉換為字串以使插入操作更容易。此外,給定數字也可能是負數,因此我們必須考慮這種情況。

示例

輸入1

Given number: 124
Given digit: 3
Output: 1234 

說明 − 我們有四個可以新增給定數字的位置,結果可以是3124、1324、1234、1243。在這四個數字中,倒數第二個最小。

輸入2

Given number: -124
Given digit: 3
Output: -3124 

說明 − 我們有四個可以新增給定數字的位置,結果可以是-3124、-1324、-1234、-1243。在這四個數字中,第一個最小。

樸素方法

我們已經看到了示例,現在讓我們繼續看看我們將執行的解決問題的步驟:

  • 首先,我們將檢查當前數字是正數還是負數。

  • 如果當前數字為負數,我們將將其標記為一個負變數,並將當前數字設為正數。

  • 之後,我們將當前數字轉換為字串,並根據當前數字是負數還是正數來呼叫函式。

  • 在函式中,我們將嘗試將數字放在每個位置,並將根據正數或負數檢查當前數字是較小還是較大。

  • 如果當前數字為正數,我們將嘗試找到最小的數字並返回該數字。

  • 否則,我們將找到最大的數字,並將其乘以-1後返回。

示例

#include <bits/stdc++.h>
using namespace std;
int findMin(string str, int d){
   string ans = str + to_string(d); // variable to store the answer     
   // traversing over the string 
   for(int i=0; i<= str.size(); i++){
      ans = min(ans, str.substr(0,i) + to_string(d) + str.substr(i));
   }
   return stoi(ans);
}
int findMax(string str, int d){
   string ans = str + to_string(d); // variable to store the answer     
   // traversing over the string 
   for(int i=0; i<= str.size(); i++){
      ans = max(ans, str.substr(0,i) + to_string(d) + str.substr(i));
   }
   return stoi(ans);
}
int minimumNumber(int n, int d){
   // checking for the negative number 
   int isNeg = 1;    
   if(n < 0){
      n *= -1;
      isNeg = -1;
   }    
   // converting the current number to string 
   string str = to_string(n);    
   if(isNeg == 1){
      return findMin(str,d);
   }
   else{
      return -1*findMax(str,d);
   }
}
int main(){
   int n = -124; // given number 
   int d = 3; // given digit     
   // calling to the function 
   n = minimumNumber(n, d);    
   cout<<"The minimum number after adding the new digit is "<<n<<endl;
   return 0;
}

輸出

The minimum number after adding the new digit is -3124

時間和空間複雜度

上述程式碼的時間複雜度為O(N*N),其中N是給定數字中數字的個數。

上述程式碼的空間複雜度為O(N),其中N是給定數字中數字的個數。

高效方法

在先前的方法中,我們遍歷每個數字並檢查每個數字,但是高效的方法只是找到對於正數而言大於給定數字的第一個數字並將其新增並返回自身。對於負數,找到小於它的數字中的數字並將其新增並返回。

讓我們看看程式碼:

示例

#include <bits/stdc++.h>
using namespace std;
int findMin(string str, int d){
   // traversing over the string 
   for(int i=0; i<= str.size(); i++){
      if(str[i]-'0' > d){
         return stoi(str.substr(0,i) + to_string(d) + str.substr(i));
      }
   }
   return stoi(str + to_string(d));
}
int findMax(string str, int d){
   // traversing over the string 
   for(int i=0; i<= str.size(); i++){
      if(str[i]-'0' < d){
         return stoi(str.substr(0,i) + to_string(d) + str.substr(i));
      }
   }
   return stoi(str + to_string(d));
}
int minimumNumber(int n, int d){
   // checking for the negative number 
   int isNeg = 1;
   if(n < 0){
      n *= -1;
      isNeg = -1;
   }   
   // converting the current number to string 
   string str = to_string(n);    
   if(isNeg == 1){
      return findMin(str,d);
   }
   else{
      return -1*findMax(str,d);
   }
}
int main(){
   int n = 124; // given number 
   int d = 3; // given digit     
   // calling to the function 
   n = minimumNumber(n, d);    
   cout<<"The minimum number after adding the new digit is "<<n<<endl;
   return 0;
}

輸出

The minimum number after adding the new digit is 1234

時間和空間複雜度

上述程式碼的時間複雜度為O(N),其中N是給定數字中數字的個數。

上述程式碼的空間複雜度為O(N),其中N是給定數字中數字的個數。

結論

在本教程中,我們實現了一種方法,在給定數字中插入數字意味著在給定數字的前面、後面或中間新增一個新的給定數字。我們已經看到了兩種方法,一種的時間複雜度為O(N*N),另一種為O(N)。兩種方法的空間複雜度均為O(N)。

更新於:2023年5月16日

259 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.