الفنون رقم 028
الفنون رقم 028
الفنون 028
هذه المادة 28
ARTS هو نشاط بدأه
由左耳朵耗子--陈皓: قم بإجراء سؤال واحد على الأقل عن خوارزمية leetcode كل أسبوع، واقرأ مقالًا تقنيًا واحدًا على الأقل باللغة الإنجليزية وعلق عليه، وتعلم مهارة فنية واحدة على الأقل، وشارك المقالة مع الآراء والأفكار. (أي أن الخوارزمية والمراجعة والنصائح والمشاركة يشار إليها باسم ARTS) وتستمر لمدة عام واحد على الأقل.
سؤال خوارزمية الخوارزمية
2. إضافة رقمين
الصعوبة: متوسطة
إعطاء قائمتين مرتبطتين غير فارغتين لتمثيل عددين صحيحين غير سالبين. من بينها، يتم تخزين أرقامها الخاصة بترتيب عكسي، ويمكن لكل عقدة من عقدها تخزين رقم واحد فقط.
إذا أضفنا هذين الرقمين، فسيتم إرجاع قائمة مرتبطة جديدة تمثل مجموعهما.
يمكنك افتراض أن أيًا من الأرقام لن يبدأ بالرقم 0 باستثناء الرقم 0.
مثال:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
صعوبة هذا السؤال متوسطة. تكمن الصعوبة الرئيسية في النظر في حالات مختلفة. إجابتي الأولى هي كما يلي:
الحل
اللغة: ج
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* root = NULL;//(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* p = NULL;
int sum = 0;
while (l1 != NULL || l2 != NULL ) {
if (l1 != NULL && l2 != NULL ) {
sum = l1->val + l2->val + sum / 10;
l1 = l1->next;
l2 = l2->next;
}
else if (l1 != NULL){
sum = l1->val+ sum / 10;
l1 = l1->next;
}
else if (l2 != NULL){
sum = l2->val + sum / 10;
l2 = l2->next;
}
if (p == NULL) {
p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->val = sum % 10;
p->next = NULL;
root = p;
}
else{
struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
temp->val = sum % 10;
temp->next = NULL;
p->next = temp;
p=temp;
}
}
return root;
}
المنطق أعلاه واضح وبسيط جدًا أيضًا، ولكن عندما يكون الإدخال 5 أو 5، تكون النتيجة خاطئة. لأنني أعطيت الموقف أقل تفكيرا.
النتيجة النهائية:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* root = NULL;//(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* p = NULL;
int sum = 0;
while (l1 != NULL || l2 != NULL ) {
int flag = 0;
if (l1 != NULL && l2 != NULL ) {
sum = l1->val + l2->val + sum / 10;
l1 = l1->next;
l2 = l2->next;
if (l1 == NULL && l2 == NULL) {
flag = 1;
}
}
else if (l1 != NULL){
sum = l1->val+ sum / 10;
l1 = l1->next;
if (l1 == NULL) {
flag = 1;
}
}
else if (l2 != NULL){
sum = l2->val + sum / 10;
l2 = l2->next;
if (l2 == NULL) {
flag = 1;
}
}
if (p == NULL) {
p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->val = sum % 10;
p->next = NULL;
root = p;
}
else{
struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
temp->val = sum % 10;
temp->next = NULL;
p->next = temp;
p=temp;
}
if (flag ==1 && sum >=10) {
struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
temp->val = sum / 10;
temp->next = NULL;
p->next = temp;
p=temp;
}
}
return root;
}
نتيجة العملية المذكورة أعلاه هي:
Runtime: 40 ms, faster than 10.93% of C online submissions for Add Two Numbers.
Memory Usage: 17.7 MB, less than 55.74% of C online submissions for Add Two Numbers.
يبلغ وقت تشغيل سجل الإرسال التالي 16 مللي ثانية، وهو في المرتبة الأولى حاليًا:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* recursiveAddTwoNumbers(struct ListNode* l1, struct ListNode* l2, int carry);
struct ListNode* recursiveFinishAdd(struct ListNode* l, int carry);
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
return recursiveAddTwoNumbers(l1, l2, 0);
}
struct ListNode* recursiveAddTwoNumbers(struct ListNode* l1, struct ListNode* l2, int carry) {
if(l1 == NULL) return recursiveFinishAdd(l2, carry);
if(l2 == NULL) return recursiveFinishAdd(l1, carry);
int val = l1->val + l2->val + carry;
struct ListNode *next = recursiveAddTwoNumbers(l1->next, l2->next, val/10);
struct ListNode *node = malloc(sizeof(struct ListNode));
node->val = val%10;
node->next = next;
return node;
}
struct ListNode* recursiveFinishAdd(struct ListNode* l, int carry) {
if(l == NULL) {
if(carry == 0) return NULL;
struct ListNode *node = malloc(sizeof(struct ListNode));
node->val = carry;
node->next = NULL;
return node;
}
int val = l->val + carry;
struct ListNode *next = recursiveFinishAdd(l->next, val/10);
struct ListNode *node = malloc(sizeof(struct ListNode));
node->val = val%10;
node->next = next;
return node;
}
لكنني قمت بتشغيله وكانت النتائج كما يلي، وبالتالي فإن بيئة الاختبار تتغير أيضًا، كما يتغير وقت تشغيل نفس الكود.
Runtime: 32 ms, faster than 46.07% of C online submissions for Add Two Numbers.
Memory Usage: 18.2 MB, less than 5.07% of C online submissions for Add Two Numbers.
3. أطول سلسلة فرعية بدون أحرف متكررة نسخ لـ Markdown
الصعوبة: متوسطة
بالنظر إلى سلسلة، يرجى العثور على طول أطول سلسلة فرعية لا تحتوي على أحرف متكررة.
مثال 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
مثال 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
مثال 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
الحل
اللغة: ج
جوابي هو كما يلي:
//滑动窗口
int lengthOfLongestSubstring(char* s) {
int maxLength = 0;
int strLength = strlen(s);
int leftP = 0;
int sublength = 0;
for(int i = 0; i < strLength; i++){
int flag = 0;
for(int j = leftP; j < i; j++){
if (s[j]== s[i]) {
flag =1;
leftP = j+1;
sublength = i - j;
break;
}
}
if (flag ==0){
sublength++;
}
if(sublength > maxLength) {
maxLength = sublength;
}
}
if(sublength > maxLength) {
maxLength = sublength;
}
return maxLength;
}
فيما يلي مثال يستغرق تنفيذه 8 مللي ثانية، لكنني قمت بتشغيله وكان وقت التنفيذ هو نفس الكود الخاص بي (ما يلي هو وقت تنفيذ الكود الخاص بي)

int lengthOfLongestSubstring(char* s) {
int maxlen = 0,currlen = 0;
int table[128], i, j, start = 0;
memset(table, 0, sizeof(table));
for (i = 0; s[i] != '\0'; ++i){
int num = ++table[s[i]];
if( num == 2 ){
if (currlen > maxlen){
maxlen = currlen;
}
for(j = start; j < i; ++j){
if (s[j] == s[i]){
table[s[j]] = 1;
start = j+1;
break;
}else{
--currlen;
table[s[j]] = 0;
}
}
}else{
++currlen;
}
}
if (currlen > maxlen){
maxlen = currlen;
}
return maxlen;
}
النسخة الإنجليزية: نموذج تقديم 8 مللي ثانية، فكرة هذا التنفيذ هي

int lengthOfLongestSubstring(char* s)
{
int len=0;
char *end=s,*temp;
char* addressTable[128]={NULL};
while(*end){
temp = addressTable[*end];
addressTable[*end]=end;
if(temp>=s){
len=end-s>len?end-s:len;
s = temp+1;
}
end++;
}
len=end-s>len?end-s:len;
return len;
}
4. أوجد الوسيط لصفيفين مرتبين
الصعوبة: الصعوبة
نظرًا لمصفوفتين مرتبتين nums1 و nums2 بحجم m و n.
يرجى العثور على متوسط هاتين الصفيفتين المرتبتين، ويجب أن يكون التعقيد الزمني للخوارزمية هو O(log(m + n)).
يمكنك افتراض أن nums1 وnums2 لن يكونا فارغين في نفس الوقت.
مثال 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
مثال 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
الحل
اللغة: ج
دمج المصفوفات أولا، ثم احسب
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
int sumSize = nums1Size + nums2Size;
int *sum = (int*)malloc(sizeof(int) * sumSize);
int loop1 = 0;
int loop2 = 0;
for (int i =0; i< sumSize; i++) {//合并数组
if (loop1>=nums1Size) {
for (int j = i; j < sumSize; j++) {
sum[j] = nums2[loop2++];
}
break;
}
if (loop2>=nums2Size) {
for (int j = i; j < sumSize; j++) {
sum[j] = nums1[loop1++];
}
break;
}
int r1 = nums1[loop1];
int r2 = nums2[loop2];
if (r1 < r2) {
sum[i] = r1;
loop1++;
}
else{
sum[i] = r2;
loop2++;
}
}
//计算最终结果
double r = 0;
if (sumSize % 2 == 0 ) {
int l1 = sumSize / 2;
int l2 = l1 - 1;
r = ((double)(sum[l1] + sum[l2]))/2;
}
else{
int l = sumSize / 2;
r = sum[l];
}
return r;
}
مراجعة
تتحدث هذه المقالة بشكل أساسي عن عدوك الحقيقي عند بدء عمل تجاري وتصنيع المنتجات. https://dandan2009.github.io/2019/03/20/competitors-are-not-the-enemy/
نصائح
عندما يرسل git التعليمات البرمجية، تكون هناك معلومات المؤلف، مثل اسم المستخدم وعنوان البريد الإلكتروني. لكن إذا كانت معلومات المؤلف خاطئة عن طريق الخطأ أو غير مطابقة للمواصفات، فكيف يمكنني تعديلها؟ يمكن أن يساعدك البرنامج النصي التالي في تعديل معلومات المؤلف المقدمة. لاحظ أن هنا جميع معلومات المؤلف المقدمة التي تم تعديلها. عند استخدامه، احرص على عدم تغيير إرسالات الأشخاص الآخرين إلى مشاركاتك.
#!/bin/sh
git filter-branch --env-filter '
an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"
if [ "$GIT_COMMITTER_EMAIL" = "要修改的@邮箱地址.com" ]
then
cn="想要改成的用户名"
cm="想要改成的邮箱"
fi
if [ "$GIT_AUTHOR_EMAIL" = "要修改的@邮箱地址.com" ]
then
an="想要改成的用户名"
am="想要改成的邮箱"
fi
export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'
بعد تنفيذ الخطوات المذكورة أعلاه، ادفع السجل الصحيح إلى Github:
git push --force --tags origin 'refs/heads/*'
ملحوظة:
1 يرجى عمل نسخة احتياطية من الكود قبل التنفيذ
2 بعد تنفيذ git push --force --tags origin 'refs/heads/*'، احذف المستودع المحلي الموجود وقم باستنساخه مرة أخرى.
عند تنفيذ البرنامج النصي أعلاه مرة أخرى في نفس المستودع، سيُطلب منك:
Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f
فقط قم بتنفيذ الأمر التالي
git update-ref -d refs/original/refs/heads/master
شارك
تمت مشاركة المحتوى التالي بواسطة أحد مستخدمي الإنترنت في مجموعة WeChat.
هذه الحالة بسيطة جدًا ومثيرة للاهتمام، ولكن الطلب عليها حقيقي وقوي. لقد جلبت لنا مشاركة المؤلف الأصلي الكثير من الإلهام لاكتشاف نقاط الألم وتطوير المنتج. الوضع الأساسي
- اسم المنتج: برامج سالم
- ميزات المنتج: النسخة الإسبانية من تطبيق Bible iOS
- حجم التثبيت: أكثر من 1.3 مليون
- الدخل الشهري : أكثر من 10,000 دولار 4 إلهامات يقدمها لنا المنتج من 0 إلى 1
- يفهم المؤلف اللغة الإسبانية، لذلك قام بعمل نسخة إسبانية من الكتاب المقدس كتطبيق Jos، وتم إصدار نسخة صوتية إسبانية من التطبيق بعد فترة من الزمن.
- ذكر طريقة للعثور بسرعة على الاحتياجات الحقيقية: تصفح قائمة متجر التطبيقات، وابحث عن التطبيقات ذات التقييمات الضعيفة من الأعلى إلى الأسفل، ثم انسخها إلى نماذج اللغات الأخرى. ولأن هذه الاحتياجات قد تم تأكيدها ونجاح النموذج، فما عليك سوى تغيير بعض المتغيرات الجديدة لتحقيق الأرباح بسرعة، مثل تغيير متغيرات اللغة وتغيير متغيرات القناة وما إلى ذلك.
- بالإضافة إلى عمل نسخة نصية من الكتاب المقدس باللغة الإسبانية، ذكر المؤلف أن إحدى العمليات الرئيسية لنمو دخله كانت عمل نسخة صوتية من هذه المحتويات المجانية، مما أدى إلى زيادة دخله السلبي بشكل كبير. مصدر الإلهام بالنسبة لنا هو أنه بالإضافة إلى المتغيرات مثل اللغة والقنوات، فإن شكل الوسائط يعد أيضًا متغيرًا. النصوص والصور والصوت والفيديو. كل نوع له الطلب المناسب له. نحن بحاجة للبحث عن الثغرات في السوق واكتشافها.
- من هذه الحالة، يمكننا أيضًا الحصول على الإلهام: العثور على أعمال في مجال حقوق الطبع والنشر العام، وإعادة معالجتها وإعادة إنتاجها لجعلها أكثر انسجامًا مع احتياجات الجمهور، مثل Water Margin وDream of Red Mansions، وإعادة معالجتها وإعادة توزيعها.
تم ذكره هنا لإنشاء التطبيق الخاص بك. إذا كنت ترغب في التطوير بشكل مستقل ولكن ليس لديك أي فكرة، فيمكنك تجربة ذلك.
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