题目

给定 n 个数,可以执行一种操作:每次选中一个偶数,然后把这些数中与该数相等的数都除以 2。例如现在有一个数组为 [2,2,3],那么可以执行一次操作,使得这个数组变为[1,1,3]。
对于任意的 n 个数,最少需要操作多少次,使得这些数都变成奇数?

解题思路

对这 n 个数执行所有操作后,操作过程中出现多少种偶数(包括 a 中的偶数本身)即为所求。

遍历数组 a,如果该数是偶数且没有出现过,就累加一次计入答案。集合 st 记录当前已计算过的偶数。

C++代码

class Solution {
public:
    /**
     * 返回一个数,代表让这些数都变成奇数的最少的操作次数
     * @param n int整型 代表一共有多少数
     * @param a int整型vector 代表n个数字的值
     * @return int整型
     */
    int solve(int n, vector<int>& a) {
        // write code here
        int cnt = 0;
        set<int> st;
        for(auto i : a){
            while(i%2==0 && st.find(i)==st.end()){
                ++cnt;
                st.insert(i);
                i /= 2;;
            }
        }
        return cnt;
    }
};