Js常見演算法實現彙總

来源:http://www.cnblogs.com/breaktop/archive/2016/07/18/5680862.html
-Advertisement-
Play Games

/*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.length; for(var i=0;i<len;i++){ for(var j=i+1;j<len;j++) { if(arr[i]==a ...


 

/*去重*/

<script>

function delRepeat(arr){

  var newArray=new Array();

  var len=arr.length;

  for(var i=0;i<len;i++){

     for(var j=i+1;j<len;j++)

     {

       if(arr[i]==arr[j])

       {

         ++i;  

       }

     }

    newArray.push(arr[i]);

  }

 return newArray;

}

var arr=new Array("red","red","1","5","2");

alert(delRepeat(arr));

</script>

分類: 電腦基礎

/*二分法*/

又稱為折半查找演算法,但是有缺陷就是要求數字是預先排序好的

function binary(items,value){

 var startIndex=0,

     stopIndex=items.length-1,

     midlleIndex=(startIndex+stopIndex)>>>1;

     while(items[middleIndex]!=value && startIndex<stopIndex){

       if(items[middleIndex]>value){

          stopIndex=middleIndex-1;

       }else{

          startIndex=middleIndex+1;

       }

       middleIndex=(startIndex+stopIndex)>>>1;

     }

     return items[middleIndex]!=value ? false:true;

}

 

/*十六進位顏色值的隨機生成*/

function randomColor(){

 var arrHex=["0","2","3","4","5","6","7","8","9","a","b","c","d"],

     strHex="#",

     index;

     for(var i=0;i<6;i++){

      index=Math.round(Math.random()*15);

      strHex+=arrHex[index];

     }

 return strHex;

}

 

/*一個求字元串長度的方法*/

function GetBytes(str){

 var len=str.length,

     bytes=len;

 for(var i=0;i<len;i++){

   if(str.CharCodeAt>255){

     bytes++;

   }

 }

 return bytes;

}

 

/*插入排序*/

所謂的插入排序,就是將序列中的第一個元素看成一個有序的子序列,然後不段向後比較交換比較交換。

---------------------------------華麗麗的分割線-------------------------------------

function insertSort(arr){

  var key;

  for(var j = 1; j < arr.length ; j++){ 

      //排好序的

      var i = j - 1;

      key = arr[j];

      while(i >= 0 && arr[i] > key){  

          arr[i + 1] = arr[i];       

          i --;        

     }

     arr[i + 1] = key;

  }

 return arr;

}

 

 

 

 

/*希爾排序*/

希爾排序,也稱遞減增量排序演算法具體描述:http://zh.wikipedia.org/zh/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F

其實說到底也是插入排序的變種

function shellSort(array){

       var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; // reverse()在維基上看到這個最優的步長較小數組

        var i = 0;

        var stepArrLength = stepArr.length;

        var len = array.length;

        var len2 =  parseInt(len/2);

        for(;i < stepArrLength; i++){

            if(stepArr[i] > len2){

                continue;

            }

            stepSort(stepArr[i]);

        }

        // 排序一個步長

        function stepSort(step){  

            //console.log(step) 使用的步長統計

            var i = 0, j = 0, f, tem, key;

            var stepLen = len%step > 0 ?  parseInt(len/step) + 1 : len/step; 

            for(;i < step; i++){// 依次迴圈列

                for(j=1;/*j < stepLen && */step * j + i < len; j++){//依次迴圈每列的每行

                    tem = f = step * j + i;

                    key = array[f];

 

                    while((tem-=step) >= 0){// 依次向上查找

                        if(array[tem] > key){

                            array[tem+step] = array[tem];

                        }else{

                            break;

                        }

                    }    

                    array[tem + step ] = key;

                }

            }

        }

        return array;

}

 

/*快速排序*/

其實說到底快速排序演算法就系對冒泡排序的一種改進,採用的就是演算法理論中的分治遞歸的思想,說得明白點,它的做法就是:通過一趟排序將待排序的紀錄分割成兩部分,其中一部分的紀錄值比另外一部分的紀錄值要小,就可以繼續分別對這兩部分紀錄進行排序;不段的遞歸實施上面兩個操作,從而實現紀錄值的排序。

這麼說可能不是很清晰,直接上代碼:

<script>

function sort(arr){

   return quickSort(arr,0,arr.length-1);

   function quickSort(arr,l,r){

       if(l<r){

          var mid=arr[parseInt((l+r)/2)],i=l-1,j=r+1;

          while(true){

          //大的放到右邊,小的放到左邊, i與j均為游標

            while(arr[++i]<mid);

            while(arr[--j]>mid);

            if(i>=j)break;//判斷條件

            var temp = arr[i];

            arr[i]=arr[j];

            arr[j]=temp;

          } 

          quickSort(arr,l,i-1);

          quickSort(arr,j+1,r);

       }

      return arr;

   }

}

function main(){

  var list=new Array(49,38,65,97,76,13,27);

  document.write(sort(list).valueOf());

}

main();

</script>

原理圖:

 

/*冒泡法*/

function bullSort(array){

 var temp;

 for(var i=0;i<array.length;i++){

   for(var j=array.length-1;j>i;j--){

     if(array[j]<array[j-1]){

       temp = array[j];

       array[j]=array[j-1];

       array[j-1]=temp;

     }

   }

 }

 return array;

}

 

/*js遞歸實現方案*/

遞歸函數是在一個函數通過調用自身的情況下去解決的:

方式如下:

function factorial(num){

    if(num<=1){

    return 1; 

   }else{

    return num*factorial(num-1);

   }

}

但是這在js裡面可能會出現錯誤:

var anotherFactorial = factorial;

factorial=null;

alert(anoterFactorial(4));

因為在調用anoterFactorial時內部的factorial已經不存在了。

解決方法是通過arguments.callee來解決。

如下:

function factorial(num){

  if(num<=1){

   return 1;

  }else{

  return num*arguments.callee(num-1);  

}

var anotherFactorial = factorial;

factorial = null;

alert(anotherFactorial(4));

成功!!!!

}

 

/**js模擬多線程**/

<html><head><title>emu -- 用command模式模擬多線程</title></head><body>

<SCRIPT LANGUAGE="JavaScript">

<!--

if (Array.prototype.shift==null)

Array.prototype.shift = function (){

    var rs = this[0];

    for (var i=1;i<this.length;i++) this[i-1]=this[i]

    this.length=this.length-1

    return rs;

}

if (Array.prototype.push==null)

Array.prototype.push = function (){

    for (var i=0;i<arguments.length;i++) this[this.length]=arguments[i];

    return this.length;

}

 

var commandList = [];

var nAction = 0;//控制每次運行多少個動作

var functionConstructor = function(){}.constructor;

function executeCommands(){

    for (var i=0;i<nAction;i++)

        if (commandList.length>0){

            var command = commandList.shift();

            if (command.constructor == functionConstructor)

                if (command.scheduleTime == null || new Date()-command.scheduleTime>0)

                    command();

                else

                    commandList.push(command);

        }

}

 

function startNewTask(){

    var resultTemp = document.getElementById("sampleResult").cloneNode(true);

    with (resultTemp){

    id="";style.display="block";style.color=(Math.floor(Math.random()* (1<<23)).toString(16)+"00000").substring(0,6);

    }

    document.body.insertBefore(resultTemp,document.body.lastChild);

    commandList.push(function(){simThread(resultTemp,1);});

    nAction++;

}

 

function  simThread(temp,n){

    if (temp.stop) n--;

    else temp.innerHTML = temp.innerHTML - (-n);

    if (n<1000)

        commandList.push(function(){simThread(temp,++n)});

    else{

        var command = function(){document.body.removeChild(temp);;nAction--;};

        command.scheduleTime = new Date()-(-2000);

        commandList.push(command);

    }

}

 

window.onload = function(){setInterval("executeCommands()",1);}

//-->

</SCRIPT>

<button onClick="startNewTask()">開始新線程</button>

 

<BR><BR>

<div id=sampleResult onMouseOver="this.stop=true" onMouseOut="this.stop=false" >0</div>

</body>

</html>

 

 

 

/*選擇法排序*/

選擇法主要有三種:

《1》簡單的選擇排序:簡單的前後交互。

/*簡單選擇法排序*/

其實基本的思想就是從待排序的數組中選擇最小或者最大的,放在起始位置,然後從剩下的數組中選擇最小或者最大的排在這公司數的後面。

http://zh.wikipedia.org/wiki/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F

function selectionSort(data)

{

        var i, j, min, temp , count=data.length;

        for(i = 0; i < count - 1; i++) {

                /* find the minimum */

                min = i;

                for (j = i+1; j < count; j++)

                {    if (data[j] < data[min])

                     { min = j;}

                 }

                /* swap data[i] and data[min] */

                temp = data[i];

                data[i] = data[min];

                data[min] = temp;

        }

   return data;

}

 

《2》樹型排序:又稱錦標賽排序,首先對n個元素進行兩兩比較,然後在其中[n/2]個較小者再進行兩兩比較如此重覆直至選出最小的關鍵字的紀錄為止。(可用完全二差樹表示)。缺點:輔助空間需求過大,和“最大值”進行多餘比較

《3》堆排序:(不適用於紀錄數較少的文件)

 堆排序演算法的過程如下:

1)得到當前序列的最小(大)的元素

2)把這個元素和最後一個元素進行交換,這樣當前的最小(大)的元素就放在了序列的最後,而原先的最後一個元素放到了序列的最前面

3)的交換可能會破壞堆序列的性質(註意此時的序列是除去已經放在最後面的元素),因此需要對序列進行調整,使之滿足於上面堆的性質.

重覆上面的過程,直到序列調整完畢為止.

js實現:

<script>

/**

* 堆排序

* @param items 數組

* @return 排序後的數組

*/

   function heapSort(items)

   {

   items = array2heap(items); //將數組轉化為堆

   for(var i = items.length - 1; i >= 0; i--)

   {

      items = swap(items, 0, i); //將根和位置i的數據交換(用於將最大值放在最後面)

      items = moveDown(items, 0, i - 1); //數據交換後恢復堆的屬性

   }

   return items;

   }

   /**

* 將數組轉換為堆

* @param items 數組

* @return 堆

*/

   function array2heap(items)

   {

   for(var i = Math.ceil(items.length / 2) - 1; i >= 0; i--)

   {

      items = moveDown(items, i, items.length - 1); //轉換為堆屬性

   }

   return items;

   }

   /**

* 轉換為堆

* @param items 數組

* @param first 第一個元素

* @param last 最後一個元素

* @return 堆

*/

   function moveDown(items, first, last)

   {

   var largest = 2 * first + 1;

   while(largest <= last)

   {

      if(largest < last && items[largest] < items[largest + 1])

      {

             largest++;

      }

      if(items[first] < items[largest])

      {

             items = swap(items, first, largest); // 交換數據

             first = largest;   //往下移

             largest = 2 * first + 1;

      }

      else

      {

             largest = last + 1; //跳出迴圈

      }

   }

   return items;

   }

   /**

* 交換數據

* @param items 數組

* @param index1 索引1

* @param index2 索引2

* @return 數據交換後的數組

*/

   function swap(items, index1, index2)

   {

   var tmp = items[index1];

   items[index1] = items[index2];

   items[index2] = tmp;

   return items;

   }

   var a = [345,44,6,454,10,154,3,12,11,4,78,9,0,47,88,9453,4,65,1,5];

   document.write(heapSort(a));

</script>

 

 

 

所謂歸併就是將兩個或者兩個以上的有序表合成一個新的有序表。

遞歸形式的演算法在形式上較為簡潔但實用性較差,與快速排序和堆排序相比,歸併排序的最大特點是,它是一種穩定的排序方法。

js實現歸併:

<script>

function MemeryArray(Arr,n, Brr, m)

{      var i, j, k;

       var Crr=new Array(); 

       i = j = k = 0;

       while (i < n && j < m)

       {

              if (Arr[i] < Brr[j])

                     Crr[k++] = Arr[i++];

              else

                     Crr[k++] = Brr[j++];

       }

       while (i < n)

             Crr[k++] = Arr[i++];

       while (j < m)

             Crr[k++] = Brr[j++];

return Crr;

}

var Arr=new Array(45,36,89,75,65);

var Brr=new Array(48,76,59,49,25);

alert(MemeryArray(Arr , Arr.length , Brr , Brr.length));

</script>

歸併排序待續,先睡了:

----------------------------------------------華麗麗的分割線-------------------------------------------------------------------------

歸併排序:

<script>

//將有二個有序數列a[first...mid]和a[mid...last]合併。

function mergearray(Arr,first,mid,last,tempArr)

{

       var i = first, j = mid + 1;

       var m = mid,   n = last;

       var k = 0;

       while (i <= m && j <= n)

       {

              if (Arr[i] < Arr[j])

                     tempArr[k++] = Arr[i++];

              else

                     tempArr[k++] = Arr[j++];

       }

       while (i <= m)

              tempArr[k++] = Arr[i++];

       while (j <= n)

              tempArr[k++] = Arr[j++];

       for (i = 0; i < k; i++)

              Arr[first + i] = tempArr[i];

}

function mergesort(Arr,first,last)

       var tempArr=new Array();

       if (first < last)

       {

         var mid = (first + last)>>>1;

         mergesort(Arr, first, mid, tempArr);    //左邊有序

         mergesort(Arr, mid + 1, last, tempArr);  //右邊有序

         mergearray(Arr, first, mid, last, tempArr);  //再將二個有序數列合併

       }

  return  Arr;

}

var Arr=new Array(1,65,45,98,56,78);

alert(mergesort(Arr,0,Arr.length-1));

</script>

 

 

/*比較兩個字元串的相似性-Levenshtein演算法簡介*/

問題與描述:

近似字元串匹配問題

說明:設給定樣本,對於任意文本串,樣本P在文本T中的K-近似匹配(K-approximate match)是指P在T中包含最多K個差異的匹配,這裡的差別指:

(1)修改:P與T中對應的字元不同
(2)刪除:T中含有一個未出現在P中的字元
(3)插入:T中不包含出現在P中的一個字元

(也就是編輯距離問題)

例如: 
T: a p r o x i o m a l l y   
P: a p p r o x i m a t l y
經過 1:插入  2:刪除 3:修改
那麼 就是一個3-近似問題

事實上,兩個字元串可能有不得出不同的差別數量,所以K-近似匹配要求:
(1)差別數最多為K個
(2)差別數為所有匹配方式下最少的稱為編輯距離
(字元串T到P最少的差別數稱為T和P的編輯距離)

試驗要求:
(1)利用動態規劃方法給出兩個字元串編輯距離的演算法
(2)分析複雜度
(3)考慮其它方法


Levenshtein Distance 來文史特距離

goodzzp

 LD也叫edit distance,它用來表示2個字元串的相似度,不同於Hamming Distance,它可以用來比較2個長度不同的字元串。LD定義為需要最少多少步基本操作才能讓2個字元串相等,基本操作包含3個:
 1,插入;
 2,刪除;
 3,替換;
 比如,kiteen和sitting之間的距離可以這麼計算:
 1,kitten – > sitten, 替換k為s;
 2,sitten – > sittin, 替換e為i;
 3,sittin – > sitting, 增加g;
 所以,其LD為3;
 計算LD的演算法表示為:
 int LevenshteinDistance(char str1[1..lenStr1], char str2[1..lenStr2])
 // d is a table with lenStr1+1 rows and lenStr2+1 columns
 declare int d[0..lenStr1, 0..lenStr2]
 // i and j are used to iterate over str1 and str2
 declare int i, j, cost

 for i from 0 to lenStr1
  d[i, 0] := i
 for j from 0 to lenStr2
  d[0, j] := j

 for i from 1 to lenStr1
  for j from 1 to lenStr2
   if str1[i] = str2[j] then cost := 0
         else cost := 1
   d[i, j] := minimum(
         d[i-1, j ] + 1,  // deletion
         d[i , j-1] + 1,  // insertion
         d[i-1, j-1] + cost // substitution
        )

 return d[lenStr1, lenStr2];
 這個演算法其實就是一個矩陣的計算:
   k i t t e n
  0 1 2 3 4 5 6
 s 1 1 2 3 4 5 6
 i 2 2 1 2 3 4 5
 t 3 3 2 1 2 3 4
 t 4 4 3 2 1 2 3 
 i 5 5 4 3 2 2 3
 n 6 6 5 4 3 3 2
 g 7 7 6 5 4 4 3
 首先給定第一行和第一列,然後,每個值d[i,j]這樣計算:d[i,j] = min(d[i-1,j]+ 1,d[i,j-1] +1,d[i-1,j-1]+(str1[i] == str2[j]?0:1));
 最後一行,最後一列的那個值就是LD的結果。
 LD(str1,str2) <= max(str1.len,str2.len);

  有人提出了Levenshtein automaton(Levenshtein自動機)來計算和某個字元串距離小於某個值的集合。這樣能夠加快近似字元串的計算過程。見文獻:Klaus U. Schulz, Stoyan Mihov, Fast String Correction with Levenshtein-Automata. International Journal of Document Analysis and Recognition, 5(1):67--85, 2002.

A Guided Tour to Approximate String Matching GONZALO NAVARRO
 這篇文章裡面對這個方面(字元串相似)進行了很多描述。其中,包含了動態規劃法計算Edit distance的方法。

-------------------------------------------華麗麗的分割線-------------------------------------------------------------------------

js實現:

<script>

//求兩個字元串的相似度,返回差別字元數,Levenshtein Distance演算法實現

function Levenshtein_Distance(s,t){

 var n=s.length;// length of s

 var m=t.length;// length of t

 var d=[];// matrix

 var i;// iterates through s

 var j;// iterates through t

 var s_i;// ith character of s

 var t_j;// jth character of t

 var cost;// cost

 // Step 1

 if (n == 0) return m;

 if (m == 0) return n;

 // Step 2

 for (i = 0; i <= n; i++) {

  d[i]=[];

  d[i][0] = i;

 }

 for (j = 0; j <= m; j++) {

  d[0][j] = j;

 }

 // Step 3

 for (i = 1; i <= n; i++) {

  s_i = s.charAt (i - 1);

  // Step 4

  for (j = 1; j <= m; j++) {

   t_j = t.charAt (j - 1);

   // Step 5

   if (s_i == t_j) {

    cost = 0;

   }else{

    cost = 1;

   }

   // Step 6

   d[i][j] = Minimum (d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1] + cost);

  }

 }

 // Step 7

 return d[n][m];

}

//求兩個字元串的相似度,返回相似度百分比

function Levenshtein_Distance_Percent(s,t){

 var l=s.length>t.length?s.length:t.length;

 var d=Levenshtein_Distance(s,t);

 return (1-d/l).toFixed(4);

}

//求三個數字中的最小值

function Minimum(a,b,c){

 return a<b?(a<c?a:c):(b<c?b:c);

}

var str1="ddsddf",str2="xdsfsx";

alert(Levenshtein_Distance_Percent(str1,str2));

</script>

 

轉自 http://www.cnblogs.com/super-d2/archive/2011/10/16/2212865.html


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

-Advertisement-
Play Games
更多相關文章
  • clip 屬性是用來設置元素的形狀。用來剪裁絕對定位元素(absolute or fixed)。 clip有三種取值:auto |inherit|rect。inherit是繼承,ie不支持這個屬性, auto是預設 前兩個基本屬於打醬油的,我們主要來說一下clip的rect屬性。 clip的rect ...
  • 上周看到大家在JS群討論如何把一句英文句子單詞收割字母大寫,大家都說用正則簡單,對於正則還是有點模糊,於是乎自己敲了下 結果是出來了,總感覺不是很好、、、 ...
  • 使用方法:在JS包的說明裡;直接使用例子也是可以的 起因:一直以來,移動端選擇器都是自己在網上滿世界的找插件 缺點: 1.前期需要自己找非常多的插件,進行篩選;浪費了自己大量的時間 2.符合要求的少之又少,能最後用上的就更少了; 3.項目有特殊要求,又要符合設計稿,難上加難; 所以,這次自己寫了一個 ...
  • 通過packet capture對舊版的第三方app進行抓包分析以後,能夠獲取cnblogs對app開放的一些api。 簡要介紹直接和網站文章內容相關的api。 希望更多精美的第三方app能夠出現 :) host:http://www.cnblogs.com endpoint:/mvc/aggsit ...
  • 使用JavaScript讀二進位文件並用ajax傳輸二進位流,目前能夠相容谷歌、IE11、IE10。 ...
  • 對於JavaScript的定時器來說沒有嚴格意義上的暫停和重啟,只有清除停止,但是可以通過一些‘障眼法’實現 allChild[index].onclick = function(){//當點擊目標且滿足下麵的條件時 讓計時器時間暫停 if(gamInt == true){ $("#tu").css ...
  • Ctrl+Shift+P:打開命令面板Ctrl+P:搜索項目中的文件Ctrl+G:跳轉到第幾行Ctrl+W:關閉當前打開文件Ctrl+Shift+W:關閉所有打開文件Ctrl+Shift+V:粘貼並格式化Ctrl+D:選擇單詞,重覆可增加選擇下一個相同的單詞Ctrl+L:選擇行,重覆可依次增加選擇下 ...
  • 頂求網首頁是一個web2.0博客類的網站首頁,在該網站中用戶可以發表博客,也可以推薦圖書給其他用戶。所以,在首頁中主要分三個板塊——文章、圖書、用戶。另外,網站的頭部和尾部還要有導航(navigator,固定在頭部)和腳註(footer),而這些元素也是整個網站都要用到的,具體實現時可以把它們放在網... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...