"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > سجلات ترميز الآلة الكاتبة: ضغط السلسلة

سجلات ترميز الآلة الكاتبة: ضغط السلسلة

تم النشر بتاريخ 2024-08-23
تصفح:854

Typescript Coding Chronicles: String Compression

بيان المشكلة:

نظرًا لمجموعة من الأحرف، قم بضغطها باستخدام الخوارزمية التالية:

  • ابدأ بسلسلة فارغة.
  • لكل مجموعة من الأحرف المتكررة المتتالية في الأحرف:
    • إذا كان طول المجموعة هو 1، قم بإلحاق الحرف بـ s.
    • خلاف ذلك، قم بإلحاق الحرف متبوعًا بطول المجموعة.

لا ينبغي إرجاع السلسلة المضغوطة بشكل منفصل، ولكن بدلاً من ذلك، يجب تخزينها في مجموعة أحرف الإدخال. لاحظ أنه سيتم تقسيم أطوال المجموعة التي تبلغ 10 أو أكثر إلى أحرف متعددة في الأحرف.

بعد الانتهاء من تعديل مصفوفة الإدخال، قم بإرجاع الطول الجديد للمصفوفة.

يجب عليك كتابة خوارزمية تستخدم مساحة إضافية ثابتة فقط.

مثال 1:

  • الإدخال: الأحرف = ["a"، "a"، "b"، "b"، "c"، "c"، "c"]
  • الإخراج: إرجاع 6، ويجب أن تكون الأحرف الستة الأولى من مصفوفة الإدخال: ["a"، و"2"، و"b"، و"2"، و"c"، و"3"]
  • شرح: المجموعات هي "aa" و"bb" و"ccc". يتم ضغط هذا إلى "a2b2c3".

مثال 2:

  • الإدخال: الأحرف = ["a"]
  • الإخراج: إرجاع 1، ويجب أن يكون الحرف الأول من مصفوفة الإدخال: ["a"]
  • شرح: المجموعة الوحيدة هي "a"، والتي تظل غير مضغوطة لأنها حرف واحد.

مثال 3:

  • الإدخال: الأحرف = ["a"، "b"، "b"، "b"، "b"، "b"، "b"، "b"، "b"، "b" ""،"ب"،"ب"]
  • الإخراج: إرجاع 4، ويجب أن تكون الأحرف الأربعة الأولى من مصفوفة الإدخال: ["a"، و"b"، و"1"، و"2"]
  • شرح: المجموعات هي "a" و"bbbbbbbbbbbb". يتم ضغط هذا إلى "ab12".

قيود:

  • 1
  • الأحرف [i] عبارة عن حرف إنجليزي صغير أو حرف إنجليزي كبير أو رقم أو رمز.

عملية التفكير الأولية:

لحل هذه المشكلة، نحتاج إلى التكرار عبر المصفوفة مع تتبع الحرف الحالي وعدده. عندما نواجه حرفًا جديدًا، نقوم بإلحاق الحرف الحالي وعدده (إذا كان أكبر من 1) بالمصفوفة. نحن بحاجة إلى التأكد من أننا نفعل ذلك في مكانه لتلبية متطلبات التعقيد المكاني.

الحل الأساسي (القوة الغاشمة):

يتضمن حل القوة الغاشمة إنشاء مصفوفة جديدة لتخزين النسخة المضغوطة من مصفوفة الإدخال. وهذا لا يوفر المساحة ولكنه يساعدنا على فهم الخطوات المتضمنة.

شفرة:

function compressBruteForce(chars: string[]): number {
    const n = chars.length;
    let compressed: string[] = [];
    let i = 0;

    while (i  1) {
            compressed.push(...count.toString().split(''));
        }
    }

    for (let j = 0; j 



تحليل تعقيد الوقت:

  • تعقيد الوقت: O(n)، حيث n هو طول المصفوفة. نقوم بالتكرار خلال المصفوفة مرة واحدة لحساب الأحرف ومرة ​​لكتابة النتيجة.
  • تعقيد المساحة: O(n)، حيث نستخدم مساحة إضافية للمصفوفة المضغوطة.

القيود:

حل القوة الغاشمة ليس فعالاً في استخدام المساحة ولا يلبي قيود استخدام مساحة إضافية ثابتة فقط.

الحل الأمثل:

يتضمن الحل الأمثل تعديل مصفوفة الإدخال الموجودة لتخزين النسخة المضغوطة. نستخدم مؤشرين: أحدهما لقراءة مصفوفة الإدخال والآخر لكتابة الإخراج المضغوط.

شفرة:

function compress(chars: string[]): number {
    let writeIndex = 0;
    let i = 0;

    while (i  1) {
            let countStr = count.toString();
            for (let j = 0; j 



تحليل تعقيد الوقت:

  • تعقيد الوقت: O(n)، حيث n هو طول المصفوفة. نقوم بالتكرار خلال المصفوفة مرة واحدة لحساب الأحرف ومرة ​​لكتابة النتيجة.
  • تعقيد الفضاء: O(1)، حيث أننا نستخدم فقط مقدارًا ثابتًا من المساحة الإضافية للمتغيرات.

التحسينات على الحل الأساسي:

  • يعمل الحل الأمثل على تقليل تعقيد المساحة إلى O(1) عن طريق تعديل مصفوفة الإدخال في مكانها.

حالات الحافة والاختبار:

حالات الحافة:

  1. تحتوي المصفوفة على حرف واحد فقط.
  2. لا يحتوي المصفوفة على أحرف متكررة متتالية.
  3. تحتوي المصفوفة على عدد كبير من الأحرف المتكررة المتتالية.

حالات الاختبار:

console.log(compressBruteForce(["a","a","b","b","c","c","c"])); // 6, ["a","2","b","2","c","3"]
console.log(compressBruteForce(["a"])); // 1, ["a"]
console.log(compressBruteForce(["a","b","b","b","b","b","b","b","b","b","b","b","b"])); // 4, ["a","b","1","2"]
console.log(compressBruteForce(["a","a","a","a","a","a","a","a","a","a"])); // 3, ["a","1","0"]
console.log(compressBruteForce(["a","b","c"])); // 3, ["a","b","c"]

console.log(compress(["a","a","b","b","c","c","c"])); // 6, ["a","2","b","2","c","3"]
console.log(compress(["a"])); // 1, ["a"]
console.log(compress(["a","b","b","b","b","b","b","b","b","b","b","b","b"])); // 4, ["a","b","1","2"]
console.log(compress(["a","a","a","a","a","a","a","a","a","a"])); // 3, ["a","1","0"]
console.log(compress(["a","b","c"])); // 3, ["a","b","c"]

الاستراتيجيات العامة لحل المشكلات:

  1. فهم المشكلة: اقرأ بيان المشكلة بعناية لفهم المتطلبات والقيود.
  2. تحديد العمليات الرئيسية: تحديد العمليات الرئيسية المطلوبة، مثل عد الأحرف المتتالية وتعديل المصفوفة في مكانها.
  3. تحسين الكفاءة: استخدم الخوارزميات وهياكل البيانات الفعالة لتقليل تعقيد الزمان والمكان.
  4. اختبار شامل: اختبر الحل مع حالات مختلفة، بما في ذلك حالات الحافة، للتأكد من صحته.

تحديد المشاكل المشابهة:

  1. التلاعب بالسلسلة:

    • المشاكل التي تحتاج فيها إلى تعديل السلاسل بناءً على شروط محددة.
    • مثال: إزالة التكرارات من سلسلة.
  2. الخوارزميات الموضعية:

    • المشاكل التي تتطلب تنفيذ العمليات في مكانها مع مساحة إضافية محدودة.
    • مثال: إزالة عناصر من مصفوفة بدون مساحة إضافية.

خاتمة:

  • يمكن حل مشكلة ضغط مصفوفة الأحرف بكفاءة باستخدام أسلوب القوة الغاشمة والأسلوب الموضعي الأمثل.
  • إن فهم المشكلة وتقسيمها إلى أجزاء يمكن التحكم فيها أمر بالغ الأهمية.
  • يضمن استخدام الخوارزميات الفعالة أن الحل الأمثل للمدخلات الكبيرة.
  • يضمن الاختبار باستخدام حالات الحافة المختلفة المتانة.
  • يمكن أن يساعد التعرف على أنماط المشكلات في تطبيق حلول مماثلة لتحديات أخرى.

من خلال ممارسة مثل هذه المشكلات والاستراتيجيات، يمكنك تحسين مهاراتك في حل المشكلات والاستعداد بشكل أفضل لمواجهة تحديات البرمجة المختلفة.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/__zamora__/typescript-coding-chronicles-string-compression-42k5?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3