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

กู้คืนที่อยู่ IP ใน C++


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

ดังนั้น หากอินพุตเป็น "25525511135" เอาต์พุตจะเป็น ["255.255.11.135", "255.255.111.35"]

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

  • กำหนดฟังก์ชัน convertToNum() ซึ่งจะใช้เวลา s เริ่มต้น สิ้นสุด

  • num :=0

  • สำหรับการเริ่มต้น i :=start เมื่อฉัน <=end อัปเดต (เพิ่ม 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 เมื่อฉัน

    • temp :=convertToNum(s, startIndex, i)

    • ถ้า temp> =0 และ temp <=255 แล้ว −

      • ใส่อุณหภูมิที่ส่วนท้ายของตำแหน่ง

      • แก้ (s, ผลลัพธ์, ตำแหน่ง, dotCount - 1, i + 1)

      • ลบองค์ประกอบสุดท้ายออกจากตำแหน่ง

  • กำหนดหนึ่งฟังก์ชัน genIp ซึ่งจะใช้สตริง s

  • กำหนดผลลัพธ์อาร์เรย์

  • กำหนดตำแหน่งอาร์เรย์

  • แก้ (s, ผลลัพธ์, ตำแหน่ง)

  • ส่งคืนผลลัพธ์

  • จากการเรียกเมธอดหลัก genIp(A)

ตัวอย่าง

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

#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> restoreIpAddresses(string A) {
   return genIp(A);
}};
main(){
   Solution ob;
   print_vector(ob.restoreIpAddresses("25525511135"));
}

อินพุต

"25525511135"

ผลลัพธ์

[255.255.11.135, 255.255.111.35, ]