笔试练习二

来源:互联网 发布:java android api 编辑:程序博客网 时间:2024/05/21 07:52

一. 春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。


int  Get_MoreThanHalf_Num(char arr[],int n){if (n <= 0){return -1;}int ret = 0;int times = 0;for (int i = 0; i < n; ++i){if (times == 0){ret = arr[i];                        times++                 }if (arr[i] == ret){times++;}else{times--;}}int count = 0;for (int i = 0; i < n; ++i){if (arr[i] == ret){count++;}}return (count > n / 2) ? ret : 0;}

二.大数乘法

输入的数据有两行,分别是两个非负数,最多10000位

输出他们的乘积

示例:

213897129837128937123

43502789523572345

输出

9305121819000846375051301723846663435


string  big_number_multiply(string a, string b){int a_len = a.length();int b_len = b.length();int len = a_len + b_len;vector<int> multi(len, 0);for (int i = 0; i < b_len; ++i){for (int j = 0; j < a_len; ++j){multi[i + j] += (b[b_len - i - 1] - '0') * (a[a_len - j - 1] - '0');}}int inc = 0; //进位for (int i = 0; i < len; ++i){multi[i] += inc;inc = multi[i] / 10;multi[i] %= 10;}int flag = 0;for (int i = len - 1; i >= 0; --i){if (multi[i] != 0){flag = i;break;}}string strRet;strRet.resize(flag+1);for (int i = flag; i >= 0; --i){strRet[flag-i] = multi[i] + '0';}return strRet;}




1 0
原创粉丝点击