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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...