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

โปรแกรมค้นหาที่อยู่ IP ที่เป็นไปได้ทั้งหมดหลังจากการคืนค่าใน C++


สมมติว่าเรามีสตริงที่มีตัวเลขเท่านั้น เราต้องกู้คืนโดยสร้างชุดค่าผสมที่อยู่ IP ที่เป็นไปได้ทั้งหมด เรารู้ว่าที่อยู่ IP ที่ถูกต้องประกอบด้วยจำนวนเต็มสี่จำนวน (แต่ละจำนวนเต็มอยู่ในช่วง 0 ถึง 255) คั่นด้วยสัญลักษณ์จุดเดียว

ดังนั้น หากอินพุตเป็นเหมือน ip ="25525511136" ผลลัพธ์จะเป็น ["254.25.40.123", "254.254.0.123"]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดฟังก์ชัน convertToNum() ซึ่งจะใช้เวลา s เริ่มต้น สิ้นสุด
  • num :=0
  • สำหรับการเริ่มต้น i :=เริ่ม เมื่อฉัน <=สิ้นสุด อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
    • num :=(num * 10) + (s[i] - ASCII of '0')
    • ถ้า num> 255 แล้ว −
      • คืน 10000
  • หมายเลขส่งคืน
  • กำหนดฟังก์ชัน addDots() ซึ่งจะรับตำแหน่ง
  • res :=สตริงว่าง
  • x :=0, posIndex :=0
  • สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของตำแหน่ง อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
    • num :=ตำแหน่ง[i]
    • สร้างหนึ่งสตริง str1
    • temp :=num เป็นสตริง
    • res :=res + อุณหภูมิ
    • ถ้าฉัน <ขนาดของตำแหน่ง แล้ว −
      • res :=res concatenate "."
  • ผลตอบแทน
  • กำหนดฟังก์ชัน Solve() จะใช้ s หนึ่งผลลัพธ์อาร์เรย์สตริง ตำแหน่งอาร์เรย์ dotCount นี่คือการเริ่มต้นด้วย 3 startIndex นี่คือการเริ่มต้นด้วย 0
  • ถ้าไม่ใช่ dotCount แสดงว่าไม่ใช่ศูนย์ และ ((ขนาดของ s - 1) - startIndex + 1) 1 แล้ว −
    • temp :=convertToNum(s, startIndex, size of s)
    • ถ้า temp> =0 และ temp <=255 แล้ว −
      • ใส่อุณหภูมิที่ส่วนท้ายของตำแหน่ง
      • res :=addDots(ตำแหน่ง)
      • ถ้าขนาดของ res เท่ากับขนาดของ s แล้ว −
        • ใส่ res ที่ท้ายผลลัพธ์
    • คืนสินค้า
  • สำหรับการเริ่มต้น i :=startIndex เมื่อฉัน <ขนาดของ s อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
    • temp :=convertToNum(s, startIndex, i)
    • ถ้า temp> =0 และ temp <=255 แล้ว −
      • ใส่อุณหภูมิที่ส่วนท้ายของตำแหน่ง
      • แก้(s, ผลลัพธ์, ตำแหน่ง, dotCount - 1, i + 1)
      • ลบองค์ประกอบสุดท้ายออกจากตำแหน่ง
  • กำหนดหนึ่งฟังก์ชัน genIp ซึ่งจะรับสตริง s
  • กำหนดผลลัพธ์อาร์เรย์
  • กำหนดตำแหน่งอาร์เรย์
  • แก้(s,ผลลัพธ์,ตำแหน่ง)
  • ผลตอบแทน
  • จากการเรียกเมธอดหลัก genIp(A)

ตัวอย่าง (C++)

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
typedef long long int lli;
class Solution {
   public:
   lli convertToNum(string s,int start, int end){
      lli num = 0;
      for (int i = start; i <= end; i++) {
         num = (num * 10) + (s[i] - '0');
         if (num > 255)
            return 10000;
      }
      return num;
   }
   string addDots(vector <int> positions){
      string res = "";
      int x = 0;
      int posIndex = 0;
      for (int i = 0; i < positions.size(); i++) {
         int num = positions[i];
         ostringstream str1;
         str1 << num;
         string temp = str1.str();
         res += temp;
         if (i < positions.size() - 1)
            res += ".";
         }
         return res;
      }
      void solve(string s, vector <string> &result,vector <int> positions, int dotCount = 3, int startIndex = 0){
         if (!dotCount && ((s.size() - 1) - startIndex + 1) >= 1) {
            int temp = convertToNum(s, startIndex, s.size() - 1);
            if (temp >= 0 && temp <= 255) {
               positions.push_back(temp);
               string res = addDots(positions);
               if (res.size() - 3 == s.size()) {
                  result.push_back(res);
            }
         }
         return;
      }
      for (int i = startIndex; i < s.size(); i++) {
         int temp = convertToNum(s, startIndex, i);
         if (temp >= 0 && temp <= 255) {
            positions.push_back(temp);
            solve(s, result, positions, dotCount - 1, i + 1);
            positions.pop_back();
         }
      }
   }
   vector<string> genIp(string s){
   vector<string> result;
   vector<int> position;
   solve(s, result, position);
   return result;
   }
   vector<string> get_ip(string A) {
   return genIp(A);
}};
main(){
   Solution ob;
   string ip = "25525511136";
   print_vector(ob.get_ip(ip));
}

อินพุต

25525511136

ผลลัพธ์

[255.255.11.136, 255.255.111.36, ]