日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[力扣]1018_可被5整除的二进制前缀

發(fā)布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [力扣]1018_可被5整除的二进制前缀 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
/* 給定由若干 0 和 1 組成的數(shù)組 A。我們定義 N_i:從 A[0] 到 A[i] 的第 i 個子數(shù)組被解釋為一個二進(jìn)制數(shù)(從最高有效位到最低有效位)。返回布爾值列表 answer,只有當(dāng) N_i 可以被 5 整除時,答案 answer[i] 為 true,否則為 false。 示例 1:輸入:[0,1,1] 輸出:[true,false,false] 解釋: 輸入數(shù)字為 0, 01, 011;也就是十進(jìn)制中的 0, 1, 3 。只有第一個數(shù)可以被 5 整除,因此 answer[0] 為真。 示例 2:輸入:[1,1,1] 輸出:[false,false,false] 示例 3:輸入:[0,1,1,1,1,1] 輸出:[true,false,false,false,true,false] 示例?4:輸入:[1,1,1,0,1] 輸出:[false,false,false,false,false]提示: 1 <= A.length <= 30000 A[i] 為 0 或 1來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/binary-prefix-divisible-by-5 著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。 */

 

方法1:

由于1 <= A.length <= 30000 顯然直接做二進(jìn)制位移很容易溢出,不能直接做移位操作或乘2操作,必然溢出。
對于取余操作有如下恒等式

$(A*2+B)%5 == ( (x+5*y)*2 + B) % 5 == (x*2+B)%5 == ((A%5)*2 + B)%5$

代碼如下:

bool* prefixesDivBy5(int* A, int ASize, int* returnSize) {bool* ret_val = NULL ;int i = 0 ;int j = 0 ;unsigned int temp_sum = 0 ;do{if( (A==NULL)||(ASize<=0)||(returnSize==NULL)){*returnSize = 0;break;}ret_val = (bool*)malloc(sizeof(bool)*ASize);if(ret_val == NULL){break; }else{for(i=0;i<ASize;i++){ret_val[i] = false; }for(i=0;i<ASize;i++){temp_sum = (temp_sum << 1)+A[i]; /*這里需要注意優(yōu)先級*/if(temp_sum%5==0){ret_val[i] = true;}temp_sum = temp_sum%5; }}*returnSize = ASize;}while(0);return ret_val; }

提交結(jié)果如下:

/* 執(zhí)行結(jié)果:通過 顯示詳情 執(zhí)行用時 :36 ms, 在所有 C 提交中擊敗了92.59%的用戶 內(nèi)存消耗 :11.5 MB, 在所有 C 提交中擊敗了6.52%的用戶 */

  

?

方法2:

[0,4]*2+[0,1]? 的結(jié)果的范圍在[0,9]之間,我們可以建立一個10個數(shù)據(jù)長度數(shù)組,用來存儲0~9對5取余數(shù)的結(jié)果,對取余操作進(jìn)行優(yōu)化。

bool* prefixesDivBy5(int* A, int ASize, int* returnSize) {bool* ret_val = NULL ;int i = 0 ;unsigned int temp_sum = 0 ;const unsigned int arr[] = {0,1,2,3,4,0,1,2,3,4};do{if( (A==NULL)||(ASize<=0)||(returnSize==NULL)){*returnSize = 0;break;}ret_val = (bool*)malloc(sizeof(bool)*ASize);if(ret_val == NULL){break; }else{for(i=0;i<ASize;i++){ret_val[i] = false; }for(i=0;i<ASize;i++){temp_sum = arr[((temp_sum << 1)+A[i])]; /*這里注意優(yōu)先級*/if(temp_sum==0){ret_val[i] = true;} }}*returnSize = ASize;}while(0);return ret_val; }

  

/* 執(zhí)行結(jié)果:通過 顯示詳情 執(zhí)行用時 :28 ms, 在所有 C 提交中擊敗了98.77%的用戶 內(nèi)存消耗 :11.7 MB, 在所有 C 提交中擊敗了6.52%的用戶 */

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/alimy/p/11169815.html

總結(jié)

以上是生活随笔為你收集整理的[力扣]1018_可被5整除的二进制前缀的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。