题目描述:
给你一个正整数 n
,你可以执行下述操作 任意 次:
返回使 n
等于 0
需要执行的 最少 操作数。
如果 x == 2i
且其中 i >= 0
,则数字 x
是 2
的幂。
数据范围:
$1\le n \le 10^5$
题解:
对于一个单独的 $1$ ,需要直接减去。对于一串连续的 $1$ ,可以先加上然后再减去。因此可以从低位开始考虑,如果连续 $1$ 的个数超过了 $1$ ,就加一次,否则就减一次。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| auto optimize_cpp_stdio = []() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); return 0; }(); class Solution { public: const static int maxn = 1e5 + 10; const static int maxm = 1e5 + 10; const int INF = 0x3f3f3f3f; int minOperations(int n) { string s; while (n) { s.push_back((n & 1) + '0'); n >>= 1; } n = s.length(); int i = 0; int cnt = 0; int ans = 0; while (i < n) { if (s[i] == '0') { if (cnt != 0) { ans++; cnt = (cnt > 1); } ++i; continue; } int j = i; while (j < n && s[j] == '1') ++j; cnt += (j - i); i = j; } if (cnt == 1) ans++; else if (cnt > 1) ans += 2; return ans; } };
|