等距二进制判断华为OD机试新系统真题 华为OD上机考试新系统真题 5月20号 100分题型华为OD机试新系统真题目录点击查看: 华为OD机试真题题库目录机考题库 算法考点详解题目内容对于一个二进制数我们定义相邻两个1 11之间0 00的数量为他们两个之间的距离如1001011 10010111001011相邻两个1 11之间的距离从左到右分别为2 22、1 11、0 00。现在如果一个整数转化为二进制数满足如下条件包含不少于3 33个1 11所有相邻数字1 11之间的距离相同 我们称之为等距二进制如21 2121二进制为10101 1010110101、60 6060二进制为111100 111100111100、146 146146二进制为10010010 1001001010010010。输入描述现给定一个输入整数0 00n nn (2 22^31 3131-1 11)输出描述如果n nn是等距二进制请输出它的距离如果不是等距二进制请输出− 1 -1−1样例1输入21输出1说明二进制为10101 1010110101距离为1 11样例2输入60输出0说明二进制为111100 111100111100距离为0 00样例3输入146输出2说明二进制为10010010 1001001010010010距离为2 22样例4输入2输出-1说明二进制为10 1010不满足条件1 11非等距二进制题解思路二进制处理可以通过从低位到高位遍历给定n来判断是不是等距二进制初始定义count 0记录出现1的次数distance -1等距二进制数1的距离定义last -1用来记录处理过程上一个1出现的位置。index记录当前index位置可以通过二进制移位进行二进制遍历结束条件为n 0,具体处理为通过与算法获取当前index位的值value n 1value 0可直接跳过如果当前value 1, 进行count 1.接下来再处理等距逻辑判断逻辑如下如果last -1,说明首次出现1更新lastindex即可。如果last ! -1说明之前低位已存在1如果此时distance -1则确定等距为distance index - last -1如果distance ! -1, 则判断index - last - 1是否distance相同不相同则可以直接确定不为等距二进制直接返回-1处理完等距逻辑之后更新last index对n 1移位处理index按照3处理之后如果count 3,不满足条件1直接返回-1.否则返回distance即可c#includeiostream #includevector #includestring #include utility #include sstream #includealgorithm #includecmath #includemap using namespace std; int getEqualBinDistance(int n) { // 二进制1的数量 int count 0; // 二进制位 int index 0; int distance -1; // 上一个1的位置 int last -1; while (n 0) { // 最末尾二进制值 int value n 1; if (value 1) { count; if (last ! -1) { if (distance -1) { distance index - last - 1; } else { // 不是等距 if (index - last-1 ! distance) { return -1; } } } last index; } index; n 1; } // 1数量小于3 if (count 3) { return -1; } return distance; } int main() { int n; cin n; int res getEqualBinDistance(n); cout res; }Javaimport java.util.*; public class Main { public static int getEqualBinDistance(int n) { // 二进制1的数量 int count 0; // 二进制位 int index 0; int distance -1; // 上一个1的位置 int last -1; while (n 0) { // 最末尾二进制值 int value n 1; if (value 1) { count; if (last ! -1) { if (distance -1) { distance index - last - 1; } else { // 不是等距 if (index - last - 1 ! distance) { return -1; } } } last index; } index; n 1; } // 1数量小于3 if (count 3) { return -1; } return distance; } public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); int res getEqualBinDistance(n); System.out.print(res); } }PythondefgetEqualBinDistance(n):# 二进制1的数量count0# 二进制位index0distance-1# 上一个1的位置last-1whilen0:# 最末尾二进制值valuen1ifvalue1:count1iflast!-1:ifdistance-1:distanceindex-last-1else:# 不是等距ifindex-last-1!distance:return-1lastindex index1n1# 1数量小于3ifcount3:return-1returndistance nint(input())resgetEqualBinDistance(n)print(res)JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});functiongetEqualBinDistance(n){// 二进制1的数量letcount0;// 二进制位letindex0;letdistance-1;// 上一个1的位置letlast-1;while(n0){// 最末尾二进制值letvaluen1;if(value1){count;if(last!-1){if(distance-1){distanceindex-last-1;}else{// 不是等距if(index-last-1!distance){return-1;}}}lastindex;}index;n1;}// 1数量小于3if(count3){return-1;}returndistance;}rl.on(line,function(line){constnNumber(line);constresgetEqualBinDistance(n);console.log(res);rl.close();});GopackagemainimportfmtfuncgetEqualBinDistance(nint)int{// 二进制1的数量count:0// 二进制位index:0distance:-1// 上一个1的位置last:-1forn0{// 最末尾二进制值value:n1ifvalue1{countiflast!-1{ifdistance-1{distanceindex-last-1}else{// 不是等距ifindex-last-1!distance{return-1}}}lastindex}indexn1}// 1数量小于3ifcount3{return-1}returndistance}funcmain(){varnintfmt.Scan(n)res:getEqualBinDistance(n)fmt.Print(res)}C语言#includestdio.hintgetEqualBinDistance(intn){// 二进制1的数量intcount0;// 二进制位intindex0;intdistance-1;// 上一个1的位置intlast-1;while(n0){// 最末尾二进制值intvaluen1;if(value1){count;if(last!-1){if(distance-1){distanceindex-last-1;}else{// 不是等距if(index-last-1!distance){return-1;}}}lastindex;}index;n1;}// 1数量小于3if(count3){return-1;}returndistance;}intmain(){intn;scanf(%d,n);intresgetEqualBinDistance(n);printf(%d,res);return0;}
华为OD机试真题 新系统-等距二进制判断(C/C++/Py/Java/Js/Go)
等距二进制判断华为OD机试新系统真题 华为OD上机考试新系统真题 5月20号 100分题型华为OD机试新系统真题目录点击查看: 华为OD机试真题题库目录机考题库 算法考点详解题目内容对于一个二进制数我们定义相邻两个1 11之间0 00的数量为他们两个之间的距离如1001011 10010111001011相邻两个1 11之间的距离从左到右分别为2 22、1 11、0 00。现在如果一个整数转化为二进制数满足如下条件包含不少于3 33个1 11所有相邻数字1 11之间的距离相同 我们称之为等距二进制如21 2121二进制为10101 1010110101、60 6060二进制为111100 111100111100、146 146146二进制为10010010 1001001010010010。输入描述现给定一个输入整数0 00n nn (2 22^31 3131-1 11)输出描述如果n nn是等距二进制请输出它的距离如果不是等距二进制请输出− 1 -1−1样例1输入21输出1说明二进制为10101 1010110101距离为1 11样例2输入60输出0说明二进制为111100 111100111100距离为0 00样例3输入146输出2说明二进制为10010010 1001001010010010距离为2 22样例4输入2输出-1说明二进制为10 1010不满足条件1 11非等距二进制题解思路二进制处理可以通过从低位到高位遍历给定n来判断是不是等距二进制初始定义count 0记录出现1的次数distance -1等距二进制数1的距离定义last -1用来记录处理过程上一个1出现的位置。index记录当前index位置可以通过二进制移位进行二进制遍历结束条件为n 0,具体处理为通过与算法获取当前index位的值value n 1value 0可直接跳过如果当前value 1, 进行count 1.接下来再处理等距逻辑判断逻辑如下如果last -1,说明首次出现1更新lastindex即可。如果last ! -1说明之前低位已存在1如果此时distance -1则确定等距为distance index - last -1如果distance ! -1, 则判断index - last - 1是否distance相同不相同则可以直接确定不为等距二进制直接返回-1处理完等距逻辑之后更新last index对n 1移位处理index按照3处理之后如果count 3,不满足条件1直接返回-1.否则返回distance即可c#includeiostream #includevector #includestring #include utility #include sstream #includealgorithm #includecmath #includemap using namespace std; int getEqualBinDistance(int n) { // 二进制1的数量 int count 0; // 二进制位 int index 0; int distance -1; // 上一个1的位置 int last -1; while (n 0) { // 最末尾二进制值 int value n 1; if (value 1) { count; if (last ! -1) { if (distance -1) { distance index - last - 1; } else { // 不是等距 if (index - last-1 ! distance) { return -1; } } } last index; } index; n 1; } // 1数量小于3 if (count 3) { return -1; } return distance; } int main() { int n; cin n; int res getEqualBinDistance(n); cout res; }Javaimport java.util.*; public class Main { public static int getEqualBinDistance(int n) { // 二进制1的数量 int count 0; // 二进制位 int index 0; int distance -1; // 上一个1的位置 int last -1; while (n 0) { // 最末尾二进制值 int value n 1; if (value 1) { count; if (last ! -1) { if (distance -1) { distance index - last - 1; } else { // 不是等距 if (index - last - 1 ! distance) { return -1; } } } last index; } index; n 1; } // 1数量小于3 if (count 3) { return -1; } return distance; } public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); int res getEqualBinDistance(n); System.out.print(res); } }PythondefgetEqualBinDistance(n):# 二进制1的数量count0# 二进制位index0distance-1# 上一个1的位置last-1whilen0:# 最末尾二进制值valuen1ifvalue1:count1iflast!-1:ifdistance-1:distanceindex-last-1else:# 不是等距ifindex-last-1!distance:return-1lastindex index1n1# 1数量小于3ifcount3:return-1returndistance nint(input())resgetEqualBinDistance(n)print(res)JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});functiongetEqualBinDistance(n){// 二进制1的数量letcount0;// 二进制位letindex0;letdistance-1;// 上一个1的位置letlast-1;while(n0){// 最末尾二进制值letvaluen1;if(value1){count;if(last!-1){if(distance-1){distanceindex-last-1;}else{// 不是等距if(index-last-1!distance){return-1;}}}lastindex;}index;n1;}// 1数量小于3if(count3){return-1;}returndistance;}rl.on(line,function(line){constnNumber(line);constresgetEqualBinDistance(n);console.log(res);rl.close();});GopackagemainimportfmtfuncgetEqualBinDistance(nint)int{// 二进制1的数量count:0// 二进制位index:0distance:-1// 上一个1的位置last:-1forn0{// 最末尾二进制值value:n1ifvalue1{countiflast!-1{ifdistance-1{distanceindex-last-1}else{// 不是等距ifindex-last-1!distance{return-1}}}lastindex}indexn1}// 1数量小于3ifcount3{return-1}returndistance}funcmain(){varnintfmt.Scan(n)res:getEqualBinDistance(n)fmt.Print(res)}C语言#includestdio.hintgetEqualBinDistance(intn){// 二进制1的数量intcount0;// 二进制位intindex0;intdistance-1;// 上一个1的位置intlast-1;while(n0){// 最末尾二进制值intvaluen1;if(value1){count;if(last!-1){if(distance-1){distanceindex-last-1;}else{// 不是等距if(index-last-1!distance){return-1;}}}lastindex;}index;n1;}// 1数量小于3if(count3){return-1;}returndistance;}intmain(){intn;scanf(%d,n);intresgetEqualBinDistance(n);printf(%d,res);return0;}