FCC上的javascript演算法題之中級篇

来源:http://www.cnblogs.com/zsqos/archive/2016/12/02/fcc02.html
-Advertisement-
Play Games

FCC中的javascript中級演算法題解答 中級演算法的題目中用到了很多js的知識點,比如迭代,閉包,以及對json數據的使用等等,現在將自己中級演算法的解答思路整理出來供大家參考討論。歡迎大家提出新的思路,寫出更簡單的解法。 說明:最小的數字並非總在最前面 如:sumAll([4, 1]) 應該返回 ...


FCC中的javascript中級演算法題解答

中級演算法的題目中用到了很多js的知識點,比如迭代,閉包,以及對json數據的使用等等,現在將自己中級演算法的解答思路整理出來供大家參考討論。歡迎大家提出新的思路,寫出更簡單的解法。

1.給一個包含兩個數字的數組。返回這兩個數字和它們之間所有數字的和。

說明:最小的數字並非總在最前面

如:sumAll([4, 1]) 應該返回 10。

  sumAll([5, 10]) 應該返回 45。

function sumAll(arr) {
  var max=Math.max(arr[0],arr[1]);
  var min=Math.min(arr[0],arr[1]);
  var num=0;
  for(var i=min; i<=max; i++){
    num+=i;
  }
  return num;
}
2.比較兩個數組,然後返回一個新數組,該數組的元素為兩個給定數組中所有獨有的數組元素。換言之,返回兩個數組的差異。

如:[1, 2, 3, 5], [1, 2, 3, 4, 5] 應該返回 [4]

  [1, "calf", 3, "piglet"], [1, "calf", 3, 4] 應該返回 ["piglet", 4]

function diff(arr1, arr2) {
  var newArr = [];
  //過濾數組1中與數組2相等的項
  var arr1Filtered=arr1.filter(function(num){
    for(var i=0; i<arr2.length; i++){
      if(num==arr2[i]){
        return false;
      }
    }
    return true;
  });
  //過濾數組2中與數組1相等的項
  var arr2Filtered=arr2.filter(function(num){
    for(var i=0; i<arr1.length; i++){
      if(num==arr1[i]){
        return false;
      }
    }
    return true;
  });
  //連接兩個數組
  newArr=arr1Filtered.concat(arr2Filtered);
  return newArr;
}
3.將給定的數字轉換成羅馬數字。

說明:關於羅馬數字請參考 http://www.baike.com/wiki/%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97&prd=so_1_doc

如:convert(2) 應該返回 "II"。

  convert(16) 應該返回 "XVI"。

  convert(501) 應該返回 "DI"。

  convert(3999) 應該返回 "MMMCMXCIX"。

function convert(num) {
  var one='';
  var two='';
  var three='';
  var four='';
  var arr=num.toString().split('');
  //對不同位數傳入不同參數,調用toRomChar函數
  one=toRomChar(arr[arr.length-1],'I','V','X');
  two=toRomChar(arr[arr.length-2],'X','L','C');
  three=toRomChar(arr[arr.length-3],'C','D','M');
  four=toRomChar(arr[arr.length-4],'M','','');
  
  return four+three+two+one;
}

function toRomChar(oneNum,char1,char2,char3){
  var rom="";
  //數字小於4時,輸出'III'形式
  if(oneNum<4){
    for(var i=0; i<oneNum; i++){
      rom+=char1;
    }
  }
  //數字等於於4時,輸出'IV'形式
  else if(oneNum==4){
      rom=char1+char2;
  }
  //數字大於4小於9時,輸出'VIII'形式
  else if(4<oneNum&&oneNum<=8){
    rom=char2;
    for(var k=0; k<oneNum-5; k++){
      rom+=char1;
    }
  }
  //數字等於9時,輸出'I '形式
  else if(oneNum==9){
      rom=char1+char3;
  }
  return rom;
}

 

4.寫一個 function,它遍歷一個對象數組(第一個參數)並返回一個包含相匹配的屬性-值對(第二個參數)的所有對象的數組。如果返回的數組中包含 source 對象的屬性-值對,那麼此對象的每一個屬性-值對都必須存在於 collection 的對象中。

說明:例如,如果第一個參數是 [{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }],第二個參數是 { last: "Capulet" },那麼你必須從數組(第一個參數)返回其中的第三個對象,因為它包含了作為第二個參數傳遞的屬性-值對。

如:where([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" }) 應該返回 [{ first: "Tybalt", last: "Capulet" }]

  where([{ "a": 1 }, { "a": 1 }, { "a": 1, "b": 2 }], { "a": 1 }) 應該返回 [{ "a": 1 }, { "a": 1 }, { "a": 1, "b": 2 }]

  where([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 }) 應該返回 [{ "a": 1, "b": 2 }, { "a": 1, "b": 2, "c": 2 }]

  where([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "c": 2 }) 應該返回 [{ "a": 1, "b": 2, "c": 2 }]

 註:此題目描述不易理解,可結合參數及要返回的值進行理解

function where(collection, source) {
  var arr = [];
  var porp=Object.keys(source);
  arr=collection.filter(function(obj){
    for(var i=0; i<porp.length; i++){
      if(obj[porp[i]]!==source[porp[i]]){ 
        //判斷參數1中各個對象的porp屬性的值是否與參數二中的porp屬性值相等
        return false;
      }
    }
    return true;
  });
  return arr;
}

 

 5.使用給定的參數對句子執行一次查找和替換,然後返回新句子。

說明:

  第一個參數是將要對其執行查找和替換的句子。

  第二個參數是將被替換掉的單詞(替換前的單詞)。

  第三個參數用於替換第二個參數(替換後的單詞)。

註意:替換時保持原單詞的大小寫。例如,如果你想用單詞 "dog" 替換單詞 "Book" ,你應該替換成 "Dog"。

如:myReplace("Let us go to the store", "store", "mall") 應該返回 "Let us go to the mall"。

  myReplace("His name is Tom", "Tom", "john") 應該返回 "His name is John"。

function myReplace(str, before, after) {
  //判斷before字元串首字母是否大寫,若是,則將after字元串首字母也替換為大寫;
  if(before.charAt(0)<'a'){
    var a=after.charAt(0);
    after=after.replace(a,a.toUpperCase());    
  }
  str=str.replace(before,after);
  return str;
}
6.把指定的字元串翻譯成 pig latin。 

說明:PIg latin是把一個英文單詞的第一個輔音或輔音叢(consonant cluster)移到詞尾,然後加上尾碼 "ay"。如果單詞以母音開始,你只需要在詞尾添加 "way" 就可以了。

如:translate("california") 應該返回 "aliforniacay"。

  translate("eight") 應該返回 "eightway"。

  translate("glove") 應該返回 "oveglay"。

function translate(str) {
  var p=/[^aeiou]/;
  var index=0;
  //計算出第一個母音字母在字元串中的位置
  for(var i=0; i<str.length; i++){
    if(p.test(str.charAt(i))){
      continue;
    }  
    index = i;
    break;
  }
  //母音字母為首字母時,給字元串加way尾碼
  if(index===0){
    str+='way';
  }
  //將輔音叢加至結尾,並加上'ay'尾碼
  else{
    var arr=str.split('');
    var del=arr.splice(0,index);
    arr=arr.concat(del);
    str=arr.join('') + 'ay';
  }
  return str;
}

 

 7.Base pairs 是一對 AT 和 CG,為給定的字母匹配缺失的鹼基。

說明:例如,對於輸入的 GCG,相應地返回 [["G", "C"], ["C","G"],["G", "C"]]

 如:pair("ATCGA") 應該返回 [["A","T"],["T","A"],["C","G"],["G","C"],["A","T"]]

  pair("CTCTA") 應該返回 [["C","G"],["T","A"],["C","G"],["T","A"],["A","T"]]

function pair(str) {
  var newArr=[];
  var arr=str.split('');
  for(var i=0; i<arr.length; i++){
    switch(arr[i]){
      case 'A':
        newArr.push(['A','T']);
        break;
      case 'T':
        newArr.push(['T','A']);
        break;
      case 'G':
        newArr.push(['G','C']);
        break;
      case 'C':
        newArr.push(['C','G']);
        break;      
    }
  }
  return newArr;
}

 

8.從傳遞進來的字母序列中找到缺失的字母並返回它。 

如:fearNotLetter("abce") 應該返回 "d"。

function fearNotLetter(str) {
  //將字元串轉為ASCII碼,並存入數組
  var arr=[];
  for(var i=0; i<str.length; i++){
    arr.push(str.charCodeAt(i));
  }
  for(var j=1; j<arr.length; j++){
    var num=arr[j]-arr[j-1];
    //判斷後一項減前一項是否為1,若不為1,則缺失該字元的前一項
    if(num!=1){
      //將缺失字元ASCII轉為字元並返回 
      return String.fromCharCode(arr[j]-1); 
    }
  }
  return undefined;
}

 

9.檢查一個值是否是基本布爾類型,並返回 true 或 false。 
function boo(bool) {
  // What is the new fad diet for ghost developers? The Boolean.
  if(bool===false){
    return true;
  }
  else if(bool===true){
    return true;
  }
  else{
    return false;
  }
}

 

10.寫一個 function,傳入兩個或兩個以上的數組,返回一個以給定的原始數組排序的不包含重覆值的新數組。 

說明:所有數組中的所有值都應該以原始順序被包含在內,但是在最終的數組中不包含重覆值。

如:unite([1, 3, 2], [5, 2, 1, 4], [2, 1]) 應該返回 [1, 3, 2, 5, 4]

  unite([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8]) 應該返回 [1, 2, 3, 5, 4, 6, 7, 8]

function unite(arr1, arr2, arr3) {
  for(var j=1; j<arguments.length; j++){
    //過濾掉第j個數組中已經在前面出現過的值
    var filteredArr=arguments[j].filter(function(num){
      for(var i=0; i<arr1.length; i++){
        if(arr1[i]==num){
          return false;
        }
      }
      return true;
    });
    arr1=arr1.concat(filteredArr);
  } 
  return arr1;
}

 

11.將字元串中的字元 &<>" (雙引號), 以及 ' (單引號)轉換為它們對應的 HTML 實體。 

如:convert("Dolce & Gabbana")應該返回 Dolce &​amp; Gabbana

  convert("Sixty > twelve") 應該返回 Sixty &​gt; twelve

function convert(str) {
  var p=/[&<>"']/g;
  str=str.replace(p,function(char){
    switch(char){
      case '&':
        return '&amp;';
      case '<':
        return '&lt;';
      case '>':
        return '&gt;';
      case '"':
        return '&quot;';
      case "'":
        return '&apos;';
    }
  });
  return str;
}

 

12.將字元串轉換為 spinal case。Spinal case 是 all-lowercase-words-joined-by-dashes 這種形式的,也就是以連字元連接所有小寫單詞。

如:spinalCase("The_Andy_Griffith_Show")應該返回 "the-andy-griffith-show"

  spinalCase("This Is Spinal Tap") 應該返回 "this-is-spinal-tap"

function spinalCase(str) {
  // "It's such a fine line between stupid, and clever."
  // --David St. Hubbins
  var newStr='';
  var p=/[\s_]/g;
  
  if(!p.test(str)){
     var arr=str.split('');
     for(var i=0; i<arr.length; i++){
       if(arr[i]<'a'){
         newStr=newStr+' ';
       }
       newStr=newStr+arr[i];
     }
    str=newStr;
   }
  //判斷傳入字元串中間是否含有空字元,若沒有則在各單詞間加入空格
  str=str.toLowerCase();
  str=str.replace(p,'-');
  //將字元串轉為小寫並將其中的空格及下劃線替換為中劃線
  return str;
}

 

 13.給一個正整數num,返回小於或等於num的斐波納契奇數之和。

說明:斐波納契數列中的前幾個數字是 1、1、2、3、5 和 8,隨後的每一個數字都是前兩個數字之和。

如:sumFibs(4)應該返回 5。

  sumFibs(1000) 應該返回 1785。

  sumFibs(75025) 應該返回 135721。
function sumFibs(num) {
  //求得小於num的斐波那契數列   註意:此數組最後一項大於num
  var arr=[1,1];
  for(var i=0; i<num; i++){
    arr[i+2]=arr[i]+arr[i+1];
    if (arr[i+2]>num){
      break;
    }
  }
  //刪除最後一項,過濾掉數列中的偶數項
  arr.splice(-1,1);
  arr=arr.filter(function(n){
    if(n%2===0){
      return false;
    }
    return true;
  });
  //對數列進行求和
  var result=arr.reduce(function(a,b){
    return a+b;
  });
  return result;
}
 14.求小於等於給定數值的質數之和。

說明:只有 1 和它本身兩個約數的數叫質數。例如,2 是質數,因為它只能被 1 和 2 整除。1 不是質數,因為它只能被自身整除。給定的數不一定是質數。

如:sumPrimes(10) 應該返回 17。

function sumPrimes(num) {
  //將所有小於等於num的質數放進一個數組
  var arr=[];
  //1不是質數,從2開始迴圈,需算上num
  for(var i=2; i<=num; i++){
    var j=2;
    //判斷i能否被從2開始的數整除
    while(i%j!==0){
      j++;
    }
    //判斷這個數是不是自身,是則加進數組
    if(i==j){
      arr.push(i);
    }
  }
  //對數組求和
  var result=arr.reduce(function (a,b){return a+b;});
  
  return result;
}
15.找出能被兩個給定參數和它們之間的連續數字整除的最小公倍數。 

說明:範圍是兩個數字構成的數組,兩個數字不一定按數字順序排序。例如對 1 和 3 —— 找出能被 1 和 3 和它們之間所有數字整除的最小公倍數。

如:smallestCommons([1, 5]) 應該返回 60。

  smallestCommons([5, 1]) 應該返回 60。

  smallestCommons([1, 13]) 應該返回 360360。

function smallestCommons(arr) {
  /*
   *此演算法的思路是,先將傳入的數組排序並補全,然後用數組的最後一項依次除以數組的其它各項,如果不能整
   *除則給最後一項加上原來數組的最後一項的值,重新進行前面的判斷,直到數組中所有項均可被整除,即可
   *得到傳入數組中所包含的數的最小公倍數
   */
  //對數組排序
  arr.sort(function(a,b){return a-b;});      
  //補全數組
  var arrLast=arr[arr.length-1];
  for(var j=1; j<arrLast-arr[0]; j++){
    arr.splice(j,0,arr[0]+j);
  }                                          
  
  var k=0;
  var num=arr[arr.length-1];
  while(k===0){
    for(var i=0; i<arr.length-1 ;i++){                              
      //判斷數組中從第一個數起至倒數第二個數,能否被最後一個數整除,若不能則跳出內部迴圈
      if(num%arr[i]!==0){                    
        break;
      }
      //如果這個數可以被整除,而且這個數是數組的倒數第二個數時,結束外部迴圈
      else if(i==arr.length-2){
        k=1;
      }
    }
    //不能整除時,給num加上數組的最後一項的值
    num+=arr[arr.length-1];
  }
  
  return num-arr[arr.length-1];
}
 16.寫一個 function,它瀏覽數組(第一個參數)並返回數組中第一個通過某種方法(第二個參數)驗證的元素。

如:find([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; }) 應該返回 8。

  find([1, 3, 5, 9], function(num) { return num % 2 === 0; }) 應該返回 undefined。

function find(arr, func) {
  var newArr=arr.filter(func);
  return newArr[0];
}
 17.棄數組(arr)的元素,從左邊開始,直到回調函數return true就停止。

說明:第二個參數,func,是一個函數。用來測試數組的第一個元素,如果返回fasle,就從數組中拋出該元素(註意:此時數組已被改變),繼續測試數組的第一個元素,如果返回fasle,繼續拋出,直到返回true。最後返回數組的剩餘部分,如果沒有剩餘,就返回一個空數組。

如:drop([1, 2, 3, 4], function(n) {return n >= 3;}) 應該返回 [3, 4]

  drop([1, 2, 3, 9, 2], function(n) {return n > 2;})應該返回 [3, 9, 2]

function drop(arr, func) {
  // Drop them elements.
  var i=0;
  do{                                  
    for(; i<arr.length; i++){
      //遍曆數組,若不滿足回調函數,則將該項從數組中刪除
      if(!func.call(func,arr[i])){
        //執行splice後數組長度減少1
        arr.splice(i,1);
        break;
      }
    }
  }
  //判斷減少一項後數組的第i項(即原數組中的第i+1項)是否滿足回調函數,若不滿足則繼續迴圈,直到滿足為止
  while(!func.call(func,arr[i]));       
  return arr;
}
 18.對嵌套的數組進行扁平化處理。你必須考慮到不同層級的嵌套。

如:steamroller([1, [2], [3, [[4]]]]) 應該返回 [1, 2, 3, 4]

  steamroller([1, [], [3, [[4]]]]) 應該返回 [1, 3, 4]

  steamroller([1, {}, [3, [[4]]]]) 應該返回 [1, {}, 3, 4]

function steamroller(arr) {
  var newArr=[];
  for(var i=0; i<arr.length; i++){
    if(!Array.isArray(arr[i])){
      newArr.push(arr[i]);
    }else{
      newArr=newArr.concat(steamroller(arr[i]));
    }
  }
  return newArr;
}

 

此題的解法是在一個for迴圈中使用了遞歸,在for迴圈中使用遞歸時,不會影響for迴圈的進程。

19.傳入二進位字元串,翻譯成英語句子並返回 

說明:二進位字元串是以空格分隔的。

如:binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111") 應該返回 "Aren't bonfires fun!?"

  binaryAgent("01001001 00100000 01101100 01101111 01110110 01100101 00100000 01000110 01110010 01100101 01100101 01000011 01101111 01100100 01100101 01000011 01100001 01101101 01110000 00100001") 應該返回 "I love FreeCodeCamp!"

function binaryAgent(str) {
  var result='';
  var arr=str.split(' ');
  for(var i=0; i<arr.length; i++){
    //二進位轉化為十進位
    var num=parseInt(arr[i],2);
    str=String.fromCharCode(num);
    result+=str;
  }
  return result;
}

 

 20.完善編輯器中的every函數,如果集合(collection)中的所有對象都存在對應的屬性(pre),並且屬性(pre)對應的值為真。函數返回ture。反之,返回false。

如:every([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}, {"user": "Laa-Laa", "sex": "female"}, {"user": "Po", "sex": "female"}], "sex") 應該返回 true。

  every([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy"}, {"user": "Laa-Laa", "sex": "female"}, {"user": "Po", "sex": "female"}], "sex") 應該返回 false。

  every([{"single": "double"}, {"single": undefined}], "single") 應該返回 false。

function every(collection, pre) {
  var result=collection.every(function(obj){
        return obj[pre];
      });
  return result;
}

 

21.創建一個計算兩個參數之和的 function。如果只有一個參數,則返回一個 function,該 function 請求一個參數然後返回求和的結果 

說明:例如,add(2, 3) 應該返回 5,而 add(2) 應該返回一個 function。

如:add(2, 3) 應該返回 5。

  add(2)(3) 應該返回 5。

  add(2, "3") 應該返回 undefined。

function add() {
    if(arguments.length==1&&typeof arguments[0]=='number'){
        var num = arguments[0];
        return function(a){
          if(typeof a=='number') return a+num;
        };
    }else if(typeof arguments[0]=='number'&&typeof arguments[1]=='number'){
        return arguments[0]+arguments[1];    
    }else{
        return undefined;
    }
}

 

具體題目可參考FCC中文網:https://freecodecamp.cn

總結一下,中級演算法對js的很多概念的理解還是很有幫助的,推薦對js不夠熟悉的同學練習一下。

文中的演算法已儘可能的做到簡潔高效,但依然有很大的改進空間,例如16題找出最小公倍數,我最初使用的方法是從1開始判斷1是否是這個數組所有元素的最小公倍數,若不是則判斷2是否為此數組的最小公倍數,以此遞增,最終找出數組中所有元素的最小公倍數。此方法雖然可行,但性能極差,經過改進後的演算法如文中16題中所給的代碼,但這絕不是最優解,我相信大家都會有更好的思路。歡迎大家指出其中的不足,並給出自己的寶貴意見。

感謝閱讀。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • B/S結構的軟體項目中有時客戶端需要實時的獲得伺服器消息,但預設HTTP協議只支持請求響應模式,這樣做可以簡化Web伺服器,減少伺服器的負擔,加快響應速度,因為伺服器不需要與客戶端長時間建立一個通信鏈接,但不容易直接完成實時的消息推送功能,如聊天室、後臺信息提示、實時更新數據等功能,但通過polli ...
  • html: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>條件渲染</title></head><body> <!-- v-if 作為判斷條件 如果滿足則展示它所附著的元素的內容--> <!-- 除了v-if ...
  • 一、Canvas canvas是HTML5中新增一個HTML5標簽與操作canvas的javascript API,它可以實現在網頁中完成動態的2D與3D圖像技術。<canvas> 標記和 SVG以及 VML 之間的一個重要的不同是,<canvas> 有一個基於 JavaScript 的繪圖 API ...
  • Active的一段話 active的英文解釋為“積極的”,表現在滑鼠上就是點擊的意思。關於active選擇器最多的示例恐怕就是應用在鏈接上面的,然而打開鏈接是一個一瞬間的動作,這不能很好的體現active選擇器的特點。 Active的特點 其實我們打開一個帶有active鏈接,激活acive是有一個 ...
  • Body JavaScript 在JavaScript腳本中放了兩個函數,saveStorage()和findStorage()函數 saveStorage()函數流程 1、從各輸入文本框中獲取數據 2、創建對象,將獲取的數據作為對象的屬性進行保存。 3、將對象轉換為JSON格式的文本數據 4、將文 ...
  • <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> #box { height: 300px; width: 300px; background-color: gre ...
  • CSS padding margin border屬性詳解 圖解CSS padding、margin、border屬性W3C組織建議把所有網頁上的對像都放在一個盒(box)中,設計師可以通過創建定義來控制這個盒的屬性,這些對像包括段落、列表、標題、圖片以及層。盒模型主要定義四個區域:內容(conte ...
  • 1.使用<script>元素向HTML頁面中插入Javascript HTML4.01中<script>標簽有6個屬性: (1)async:可選。表示立即下載腳本,不影響頁面中其他資源的下載。只對外部腳本文件有效。 (2)charset:可選。表示通過scr屬性指定的代碼的字元集。(因為大多數瀏覽器 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...