الفنون رقم 032
الفنون رقم 032
الفنون 032
هذه المادة 32
ARTS هو نشاط بدأه
由左耳朵耗子--陈皓: قم بإجراء سؤال واحد على الأقل عن خوارزمية leetcode كل أسبوع، واقرأ مقالًا تقنيًا واحدًا على الأقل باللغة الإنجليزية وعلق عليه، وتعلم مهارة فنية واحدة على الأقل، وشارك المقالة مع الآراء والأفكار. (أي أن الخوارزمية والمراجعة والنصائح والمشاركة يشار إليها باسم ARTS).
منذ أبريل، ولأن شؤوني الشخصية أخذت كل وقت فراغي، توقفت الفنون منذ 5 أشهر تقريبًا. لقد بدأت في التقاطه هذا الأسبوع. تم تنفيذ جميع أسئلة الخوارزمية السابقة بلغة C. ومن هذه المقالة، يتم تنفيذها بلغة سريعة.
الخوارزمية
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
بالنظر إلى مجموعة من الأعداد الصحيحة، قم بإرجاع مؤشرات رقمين بحيث يساوي مجموعهما هدفًا محددًا. يمكنك افتراض أنه سيكون هناك حل واحد فقط لكل إدخال، وأنه لا يمكنك استخدام نفس العنصر مرتين.
الحل
بالنسبة لمشكلة مجموع رقمين، فإن الحل الذي يمكن للجميع التفكير فيه هو استخدام حلقة ذات مستويين. فهل هناك حل أفضل؟ ويمكن تحويل هذه المسألة إلى مجموع معلوم من رقمين وعدد، وإيجاد رقم آخر؛ يتطلب العثور على رقم في مصفوفة مقارنة رأس بواحد، وهو أمر غير فعال نسبيًا. هل هناك طريقة جيدة؟ توجد بنية بيانات في اللغات الموجهة للكائنات - وهو قاموس يمكنه تلبية احتياجاتنا. يمكنك أولاً تحويل المصفوفة إلى قاموس، واستخدام القيمة كمفتاح، ويكون رمز المصفوفة منخفضًا هو القيمة. نظرًا لأنه يمكن الافتراض أن كل إدخال سيكون له حل واحد فقط، فلا يهم إذا كانت هناك قيم مكررة في المصفوفة. التنفيذ المحدد هو على النحو التالي
class Solution {
func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
var numbersDictionary: [Int: Int] = [:]
for index in 0...(nums.count - 1){
let number = nums[index]
numbersDictionary[number] = index
}
for index in 0...(nums.count - 1) {
let number = nums[index]
let remainder = target - number
let indexOfTarget = numbersDictionary[remainder]
if let indexOfTarget = indexOfTarget {
if(indexOfTarget != index){
return [indexOfTarget, index]
}
}
}
return []
}
}
486. توقع الفائز
الصعوبة: متوسطة
بالنظر إلى مجموعة من الدرجات التي هي أعداد صحيحة غير سلبية. يختار اللاعب 1 أحد الأرقام من طرفي المصفوفة متبوعًا باللاعب 2 ثم اللاعب 1 وهكذا. في كل مرة يختار فيها اللاعب رقمًا، لن يكون هذا الرقم متاحًا للاعب التالي. يستمر هذا حتى يتم اختيار جميع الدرجات. اللاعب الحاصل على أكبر عدد من النقاط يفوز.
في ضوء مجموعة من النتائج، توقع ما إذا كان اللاعب رقم 1 هو الفائز. يمكنك أن تفترض أن كل لاعب يلعب لتعظيم درجاته.
مثال 1:
Input: [1, 5, 2]
Output: False
Explanation: Initially, player 1 can choose between 1 and 2\. If he chooses 2 (or 1), then player 2 can choose from 1 (or 2) and 5\. If player 2 chooses 5, then player 1 will be left with 1 (or 2). So, final score of player 1 is 1 + 2 = 3, and player 2 is 5\. Hence, player 1 will never be the winner and you need to return False.
مثال 2:
Input: [1, 5, 233, 7]
Output: True
Explanation: Player 1 first chooses 1\. Then player 2 have to choose between 5 and 7\. No matter which number player 2 choose, player 1 can choose 233.Finally, player 1 has more score (234) than player 2 (12), so you need to return True representing player1 can win.
ملاحظة:
- 1 <= طول المصفوفة <= 20.
- أي درجات في المصفوفة المحددة هي أعداد صحيحة غير سالبة ولن تتجاوز 10,000,000.
- إذا كانت نتائج كلا اللاعبين متساوية، فإن اللاعب رقم 1 يظل هو الفائز.
الحل
الحل: البرمجة الديناميكية
اللغة: سويفت
class Solution {
// var dp1 = ()
var dp = [[Int]]()
func PredictTheWinner(_ nums: [Int]) -> Bool{
if (nums.count%2==0){
return true;
}
dp = [[Int]](repeating: [Int](repeating: 0, count: nums.count), count: nums.count)
return recur(nums,0,nums.count-1)>=0;
}
func recur(_ nums: [Int], _ start:Int, _ end:Int) -> Int{
if (start == end){
return nums[start];
}
if dp[start][end] != 0 {
return dp[start][end];
}
let left:Int = nums[start] - recur(nums, start+1, end);
let right:Int = nums[end] - recur(nums, start, end-1);
dp[start][end] = max(left, right);//ma.max(left, right);
return dp[start][end];
}
}
مراجعة
تتحدث هذه المقالة عن نمط تصميم المنشئ من خلال الكود
https://dandan2009.github.io/2019/10/17/design-patterns-by-tutorials-the-power-of-OOP-part-1/
نصائح
عندما نقوم بتصحيح الأخطاء، نحتاج أحيانًا إلى فصل نقاط لطرق النظام، مثل نقاط الفصل لطريقة setFrame الخاصة بـ UIView، ولكن ليس لدينا ملفات .m لطرق النظام. في هذه الحالة يمكننا استخدام الطريقة التالية لكسر النقاط.
هنا يمثل $arg1 الكائن الذي يرسل الرسالة، ويمثل $arg2 الطريقة، ويمثل $arg3 المعلمة الأولى، ويمثل $arg4 المعلمة الثانية.
$arg1==0x7ff965544230; في الشكل أعلاه يعني أن عنوان الكائن الذي يرسل الرسالة يجب أن يكون 0x7ff965544230؛ لتحريك نقطة التوقف
شارك
لقد ذهبت مؤخرًا إلى تايلاند. تايلاند بلد بوذي. ما أدهشني هو أن سياراتهم التي تعمل بالبطاريات والدراجات النارية ليست مقفلة. عند الدفع، لن يتعرف أمين الصندوق على صحة الأموال، حتى لو كانت 1000 فئة. سمعت أنه لا يوجد تزييف أو سرقة في تايلاند. إذا لم يكن لدى بلد ما التزوير والسرقة، فيمكنه توفير الكثير من الموارد. بدون السرقة، سيكون هناك العديد من الأشياء المضادة للسرقة، مثل الأقفال، والتي يمكن أن توفر الكثير من الموارد. بدون التزييف، سيكون هناك أشياء مختلفة للتعرف على التزييف. ويمكن استخدام الطاقة والموارد المنفقة على التزييف والتعرف عليه بطرق مفيدة. إذا فكرت في الأمر بهذه الطريقة، فإن الكثير من الموارد البشرية يتم إهدارها بالفعل. إذا لم تكن هناك حرب، فلن نضطر إلى تكوين جيش أو تطوير أسلحة مختلفة. وبدلا من ذلك، يمكننا استثمار الأموال والأشخاص الذين استخدموا في رفع مستوى الجيش وتطوير الأسلحة لتحسين البيئة المعيشية للبشرية.
What to read next
Want more posts about ARTS?
Posts in the same category are usually the best next step for reading more on this topic.
View same categoryWant to keep following #iOS?
Tags are useful for related tools, specific problems, and similar troubleshooting notes.
View same tagWant to explore another direction?
If you are not sure what to read next, return to the homepage and start from categories, topics, or latest updates.
Back home