- 题目描述:

图片说明
- 题目链接:
https://www.nowcoder.com/practice/16ce0a2222cc4d00b3545f54eab32e94?tpId=196&&tqId=37623&rp=1&ru=/activity/oj&qru=/ta/job-code-total/question-ranking

- 设计思想:
图片说明
-视频讲解链接B站视频讲解

- 复杂度分析:
图片说明
- 代码:
c++版本:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回一个数,代表让这些数都变成奇数的最少的操作次数
     * @param n int整型 代表一共有多少数
     * @param a int整型vector 代表n个数字的值
     * @return int整型
     */
    int oddNumber(int n, vector<int>& a) {
        // write code here
        map<int,int>mp;//进行数字的标记,只标记偶数即可
        int cnt = 0;//统计操作次数
        for(int i = 0;i < n;i ++){
            //如果这个数为偶数,并且这个偶数第一次出现就进行以下操作
            while(a[i] % 2 == 0 && !mp[a[i]]){
                mp[a[i]] ++;
                a[i] /= 2;
                cnt ++;
            }

        }
        return cnt;

    }
};

Java版本:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回一个数,代表让这些数都变成奇数的最少的操作次数
     * @param n int整型 代表一共有多少数
     * @param a int整型一维数组 代表n个数字的值
     * @return int整型
     */
    public int oddNumber (int n, int[] a) {
        // write code here
        Map<Integer,Integer> mp = new HashMap<Integer,Integer>();//进行数字的标记,只标记偶数即可
        int cnt = 0;//统计操作次数
        for(int i = 0;i < n;i ++){
            //如果这个数为偶数,并且这个偶数第一次出现就进行以下操作
            while(a[i]%2 == 0 && !mp.containsKey(a[i])){
                mp.put(a[i],1);
                a[i] /= 2;
                cnt ++;
            }
        }
        return cnt;
    }
}

Python版本:

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 返回一个数,代表让这些数都变成奇数的最少的操作次数
# @param n int整型 代表一共有多少数
# @param a int整型一维数组 代表n个数字的值
# @return int整型
#
class Solution:
    def oddNumber(self , n , a ):
        # write code here
        cnt = 0#统计操作次数
        mp = {}#进行数字的标记,只标记偶数即可
        for i in a:
        #如果这个数为偶数,并且这个偶数第一次出现就进行以下操作
            while i % 2 == 0 and i not in mp:
                mp[i] = 1
                i//=2
                cnt += 1
        return cnt

JavaScript版本:

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 返回一个数,代表让这些数都变成奇数的最少的操作次数
 * @param n int整型 代表一共有多少数
 * @param a int整型一维数组 代表n个数字的值
 * @return int整型
 */
function oddNumber( n ,  a ) {
    // write code here
        let mp = new Map();//进行数字的标记,只标记偶数即可
        let cnt = 0;//统计操作次数
        for(let i = 0;i < n;i ++){
            //如果这个数为偶数,并且这个偶数第一次出现就进行以下操作
            while(a[i]%2 == 0 && !mp.get(a[i])){
                mp.set(a[i],1);
                a[i] /= 2;
                cnt ++;
            }
        }
        return cnt;
}
module.exports = {
    oddNumber : oddNumber
};