刷题代码
輸入一個32位 的整數讓它反轉
(注意不能溢出)
#include<iostream> using namespace std; int reverse(int number) {int low, p, high = 0;int x = 1;while (number != 0){low = number % 10;high = high * 10 + low;number = number / 10; ?if (high > INT_MAX / 10 || (low > 7 && high == INT_MAX / 10)){return 0;cout << "error\n";}if (high < -INT_MAX / 10 || (low < -8 && high == INT_MAX / 10))return 0;}return high; ? } int main() {int number;cin >> number;int fan = reverse(number);cout << fan;? }## ?羅馬數字轉化為整數```cpp```cpp```cpp class Solution {
public:
int romanToInt(string s) {
unordered_map<char, int> m = { {‘I’,1}, {‘V’,5}, {‘X’,10},{‘L’,50},{‘C’,100}, {‘D’,500},{‘M’,1000} };
int sum = 0;
for (int i = 0; i < s.size(); ++i)
m[s[i]] < m[s[i + 1]] ? sum -= m[s[i]] : sum += m[s[i]];
return sum;}
?
給定兩個整數,被
除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算符。返回被除數 dividend 除以除數 divisor 得到的商。整數除法的結果應當截去(truncate)其小數部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2。被除數和除數均為 32 位有符號整數。除數不為 0。假設我們的環境只能存儲 32 位有符號整數,其數值范圍是 ?231, 231 ? 1。本題中,如果除法結果溢出,則返回 231 ? 1。31表示次方```cpp int div(int dividend,int divisor){if(divisor>dividend) return 0;int res=1;int original_divisor=divisor;while(dividend-divisor>=divisor)//特別需要注意的地方是dividend-divisor之后還大于等于divisor,即是dividend>=2divisor{divisor+=divisor;res+=res;}res+=div(dividend-divisor,original_divisor);return res; ?}int divide(int dividend, int divisor) {int res=0;int flag=((dividend>0&&divisor>0)||(dividend<0&&divisor<0));//先處理特殊值,即是處理邊界溢出問題 INT_MINif(divisor==1) return dividend;if(divisor==INT_MIN) return dividend==INT_MIN?1:0;if(divisor==-1) return dividend==INT_MIN?INT_MAX:-dividend;if(dividend==INT_MIN)//如果被除數是32位最小整數必須進行一定的處理,先讓其減或者加一次除數{dividend=(flag)?(dividend-divisor):(dividend+divisor);res++; ?}dividend=(dividend>0)?dividend:-dividend;divisor=(divisor>0)?divisor:-divisor;res+=div(dividend,divisor);return (flag)?res:-res; ?} ? ?## 二分查找給一個排序好的數組和一個數字,找到這個數字所在的位置,如果不存在這個數字,返回這個數字插入的位置序號
sort(nums.begin(),nums.end());int n = nums.size();int left = 0, right = n - 1,ans = n;while(left <= right){int mid = ((right - left)>> 1 )+ left;if (target <= nums[mid]){ans = mid;right = mid - 1;}elseleft = mid + 1;}return ans; int main() {vector<int>nums;int n;cin >> n;int a;for (int i = 0; i < n; i++){cin >> a;nums.push_back(a);}int number;cin >> number;int m =search(nums, number);cout << m<<endl; ? }判斷小于n的非負數中的質數 1和0不是質數 2是質數
int countPrimes(int n) {if(n < 3)return 0;;//從3開始驗算,所以初始值為1(2為質數)。int count = 1;for (int i = 3; i < n; i++){//當某個數為 2 的 n 次方時(n為自然數),其 & (n - 1) 所得值將等價于取余運算所得值//*如果 x = 2^n ,則 x & (n - 1) == x % n//if(i % 2 == 0)if ((i & 1) == 0)continue; ;bool sign = true;//用 j * j <= i 代替 j <= √i 會更好。//因為我們已經排除了所有偶數,所以每次循環加二將規避偶數會減少循環次數for (int j = 3; j * j <=i; j+=2){if (i % j == 0){sign = false;break;}}if (sign)count++; ;}return count; } 與50位技術專家面對面20年技術見證,附贈技術全景圖總結