c++ - রচলন - ধনাত্মক সংখ্যা কাকে বলে




সি++ এ নেতিবাচক এবং ধনাত্মক সংখ্যা উভয় সমন্বিত স্ট্রিংগুলির অ্যারে কীভাবে সাজান? (2)

String str[]={"-123","89","-10","456"};

str হল প্রতিটি স্ট্রিং সহ একটি পূর্ণসংখ্যার বিন্যাসে স্ট্রিংগুলির একটি অ্যারে এবং আপনাকে O(n log n) সময়ে এই অ্যারেটিতে বাছাই করতে হবে।

স্ট্রিংয়ের স্ট্রিংগুলি ধনাত্মক এবং নেতিবাচক উভয় পূর্ণসংখ্যাকে উপস্থাপন করতে পারে। এই স্ট্রিংগুলির সর্বাধিক দৈর্ঘ্য 1024 অক্ষর।

আমি জানি এই সমস্যার একটি সমাধান হ'ল স্ট্রিংগুলিকে সংখ্যায় রূপান্তর করা, তারপরে এগুলি বাদ দিয়ে তুলনা করুন; এই সমস্যার আর কোন সমাধান আছে কি?


আরেকটি সমাধান হ'ল আপনার নিজস্ব তুলনা ফাংশন বাস্তবায়ন:

  • উভয় স্ট্রিংয়ের প্রথম অক্ষর পরীক্ষা করুন। যদি একটি অঙ্ক দিয়ে শুরু হয় এবং অন্যটি একটি - দিয়ে শুরু হয় তবে তার সাথে শুরু হওয়া স্ট্রিংটি হ'ল ছোট সংখ্যা।
  • যদি উভয় স্ট্রিং একটি অঙ্ক দিয়ে শুরু হয় তবে তারের দৈর্ঘ্যের তুলনা করুন। সংক্ষিপ্ত স্ট্রিংটি ছোট সংখ্যা। যদি উভয় স্ট্রিং একই দৈর্ঘ্য হয় তবে একটি স্ট্যান্ডার্ড স্ট্রিং তুলনা করুন।
  • উভয় স্ট্রিং যদি - দিয়ে শুরু হয় তবে তারের দৈর্ঘ্যের তুলনা করুন। দীর্ঘ স্ট্রিংটি ছোট সংখ্যা। যদি উভয় স্ট্রিং একই দৈর্ঘ্য হয় তবে একটি স্ট্যান্ডার্ড স্ট্রিং তুলনা করুন, তবে ফলাফলটিকে অস্বীকার করুন।

এখানে একটি ন্যূনতম এবং সম্ভাব্য অপর্যাপ্ত (লিডিং জিরো, হোয়াইটস্পেস ইত্যাদি পরিচালনা করে না) উদাহরণ দেয় যা আপনি যা চান তা করে।

মন্তব্যগুলি কী করছে তা ব্যাখ্যা করে। :)

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

int main() {
  std::vector<std::string> strings = {
      "-1", "-1", "-20", "-4", "3", "0", "-0", "1", "20", "20", "44020",
  };

  // Assumes everything in "strings" has no whitespace in it.
  // Assumes everything in "strings" does not have leading zeroes.
  // Assumes everything in "strings" is an ascii representaion of an integer.
  // Assumes everything in "strings" is nonempty.
  std::sort(strings.begin(), strings.end(),
            [](const std::string &a, const std::string &b) {
              const bool a_is_negative = a[0] == '-';
              const bool b_is_negative = b[0] == '-';
              if (a_is_negative != b_is_negative) {
                // If they have different signs, then whichever is negative is
                // smaller.
                return a_is_negative;
              } else if (a.length() != b.length()) {
                // If they have the same sign, then whichever has more
                // characters is larger in magnitude. When the sign is negative,
                // the longer (more digits) number is "more negative". When
                // positive, the longer (more digits) number is "more positive".
                return (a.length() < b.length()) != a_is_negative;
              } else {
                // Otherwise a lexicographic comparison of "a" and "b" will
                // determine which string is larger in magnitude. Using the same
                // logic above, we account for the "negative vs. positive"
                // comparison.
                return (a < b) != a_is_negative;
              }
            });

  for (const auto &str : strings) {
    std::cout << str << " ";
  }
  std::cout << std::endl;
}





sorting