فيما يلي بعض الطرق لتقديم عدد أرقام صفيف Java لك. المحتوى المحدد هو كما يلي:
الطريقة 1:
فرز الصفيف ، ثم القيمة الوسيطة هي بالتأكيد القيمة الواجب العثور عليها. فرز الحد الأدنى من تعقيد الوقت (النوع السريع) O (NLOGN) ، بالإضافة إلى اجتياز.
الطريقة 2:
باستخدام طريقة جدول التجزئة ، أي حساب عدد أحداث كل صفيف وإخراج أرقامها أكبر من طول الصفيف.
الطريقة 3:
يتجاوز عدد الأحداث نصف طول الصفيف ، مما يشير إلى أن هذا الرقم يظهر مرات أكثر من مجموع الأرقام الأخرى.
النظر في حذف رقمين مختلفين في كل مرة ، لا يزال عدد الأحداث في الأرقام المتبقية يتجاوز العدد الإجمالي. كرر العملية باستمرار ، واستبعاد الأرقام الأخرى ، وأخيراً ابحث عن الرقم بأكثر من نصف الأحداث. التعقيد الزمني لهذه الطريقة هو o (n) وتعقيد الفضاء هو o (1).
لتغيير الفكرة ، يمكن تحقيق ذلك من خلال العد ، بدلاً من الحذف المادي الحقيقي. أثناء عملية اجتياز الصفيف ، احفظ قيمتين ، أحدهما هو الرقم في الصفيف والآخر هو عدد الأحداث. عند اجتياز الرقم التالي ، إذا كان هذا الرقم هو نفسه الرقم الذي تم حفظه مسبقًا ، يتم زيادة عدد المرات بمقدار 1 ، وإذا كان الأمر مختلفًا ، يتم انخفاض عدد المرات بمقدار 1. إذا كان عدد المرات 0 ، فاحفظ الرقم التالي وضبط الرقم 1.
public int morehalf (int [] nums) {int result = 0 ؛ int count = 1 ؛ if (nums.length == 0) return -1 ؛ result = nums [0] ؛ for (int i = 1 ؛ i <nums.length ؛ i ++) {if (count == 0) {result = nums [i] ؛ نتيجة؛}الطريقة 4:
تحسن في الفرز السريع ، المذكور سابقًا ، إذا تم فرز الصفيف ، يجب أن يكون الرقم في الموضع الأوسط هو القيمة التي تريدها. التعقيد الزمني لصفائف الفرز هو O (nlog (n)) ، ولكن بالنسبة لهذا السؤال ، هناك خوارزميات أفضل يمكن العثور عليها خلال التعقيد الزمني O (n).
اشتقاق من خوارزمية الفرز السريع ، فإن طريقة القسم () هي الطريقة الأكثر أهمية. تقوم هذه الطريقة بإرجاع فهرس ، والذي يمكن أن يضمن فرز الرقم في موضع الفهرس. يكون الرقم الموجود على يسار الفهرس أصغر من الرقم الذي يوجد فيه الفهرس ، والرقم الموجود على يمين الفهرس أكبر من الرقم الذي يوجد فيه الفهرس. ثم يمكن حل هذا السؤال باستخدام هذه الفكرة.
فهرس العودة عبر partition (). إذا فهرس == منتصف ، فهذا يعني أنه تم العثور على متوسط الصفيف ؛ إذا كان الفهرس ، فهذا يعني أن الوسيط هو بين [start ، index-1]. أعلم أنه يتم الحصول على نهاية الفهرس == منتصف الحلقة.
public int partition (int [] nums ، int start ، int end) {int pivotkey = nums [start] ؛ int intern = start ؛ chare (start <end) {بينما start <end && nums [end]> = pivotkey) end-؛ swap (nums ، start ، end) ؛ swap (nums ، incort ، end) ؛ end end ؛} p int [] swap (int [] ints ، int x ، int y) {int temp = ints [x] ؛ ints [x] = ints [y] ؛ ints [y] = temp ؛ العودة ints. } public int morethanhalf (int [] nums) {if (nums.length == 0) return -1 ؛ int start = 0 ؛ int end = nums.length-1 ؛ int index = partition (nums ، end ، end) ؛ int mid = nums.length/2 ؛ partition (nums ، start ، index-1) ؛ else {// lelld endray index of index+1 to end section = partition (nums ، index+1 ، end) ؛}} return [index] ؛}يقدم المحتوى أعلاه المحتوى ذي الصلة لرمز Java الذي ينفذ الأرقام التي تظهر أكثر من نصف الأوقات في صفيف. آمل أن يكون ذلك مفيدًا للجميع!