zoukankan      html  css  js  c++  java
  • 2016.5.16——leetcode:Rotate Array,Factorial Trailing Zeroe

    Rotate Array

    本题目收获:

      题目:  

      Rotate an array of n elements to the right by k steps.

      For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

      思路:

      我的思路:新建一个数组存放旋转后的内容,但是怎么把原数组的内容存放在数组中,不清楚。

      leetcode/discuss思路: 思路一:新建数组,复制原数组,将新数组的内容存放在原数组中, nums[(i + k)%n] = numscopy[i]

                   思路二:反转先将数组反转位reverse(nums,nums+n) [7,6,5,4,3,2,1] 

                       在反转reverse(nums,nums+k) [5,6,7,4,3,2,1]

                                                      在反转reverse(nums+k,nums+n) [5,6,7,4,3,2,1]

      代码:

      代码1:思路1 时间、空间复杂度均为(n)

     1 class Solution 
     2     {
     3     public:
     4         void rotate(int nums[], int n, int k) //返回值为空
     5         {
     6             if ((n == 0) || (k <= 0))
     7             {
     8                 return;    //所以returnd的为空
     9             }
    10 
    11             // Make a copy of nums
    12             vector<int> numsCopy(n);
    13             for (int i = 0; i < n; i++)
    14             {
    15                 numsCopy[i] = nums[i];
    16             }
    17 
    18             // Rotate the elements.
    19             for (int i = 0; i < n; i++)
    20             {
    21                 nums[(i + k)%n] = numsCopy[i];
    22             }
    23         }
    24     };

      代码2:思路二 时间复杂度为(n),空间复杂度为(1)

     

    1 void rotate(int nums[], int n, int k) {
    2     reverse(nums,nums+n);    //解释见思路
    3     reverse(nums,nums+k%n);
    4     reverse(nums+k%n,nums+n);
    5 }
     1 //在leetcode上可以运行的,int n = nums.size()无法通过
     2 class Solution {
     3 public:
     4     void rotate(vector<int>& nums, int k) {
     5         k %= nums.size();
     6         reverse(nums.begin(),nums.end());
     7         reverse(nums.begin(),nums.begin()+k);
     8         reverse(nums.begin()+k,nums.end());
     9     }
    10 };

       自己跑的代码:还存在问题,先放上去。

     1 // Rotate Array.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include "iostream"
     6 #include"algorithm"
     7 //#include "string"
     8 #include "vector"
     9 using namespace std;
    10 /*
    11 class MyClass1
    12 {
    13 public:
    14     void RotateArray(int nums[], int n, int k)
    15     {
    16         if (n == 0 || k == 0) //return nums[n];
    17 
    18         vector<int> numscopy[n];
    19 
    20         for (int i = 0; i < n; i++)
    21         {
    22             numscopy[i] = nums[i];
    23         }
    24 
    25         for (int i = 0; i < n; i++)
    26         {
    27             nums[(i + k)%n] = numscopy[i];
    28         }
    29         //return nums[n];
    30     }
    31 };*/
    32 
    33 class MyClass2
    34 {
    35 public:
    36     void RotateArray(int nums[], int n, int k)
    37     {
    38 
    39         k = k%n;
    40         
    41         reverse(nums, nums + n);
    42         reverse(nums, nums + (n-k));    //参考代码为 reverse(nums,nums+(n-k)),但是输出不对
    43         reverse(nums + (n-k), nums + n);
    44         //return nums;
    45     }
    46 };
    47 
    48 
    49 
    50 int _tmain(int argc, _TCHAR* argv[])
    51 {
    52     size_t const N = 8;
    53     int k ;
    54     int x = 0, y = 0;
    55     int arrary[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
    56     //MyClass1 solution;
    57     MyClass2 solution;
    58     /* 如何一次输入
    59     for (int j = 0; j < N; j++)
    60     {
    61         cin << arrary[j] << ", ";
    62     }*/
    63     cin >> k; 
    64     solution.RotateArray(arrary, N, k);
    65     //将数组一次全部输出
    66     cout << "[";
    67     for (int i = 0; i < N; i++)
    68     {
    69         cout <<arrary[i] << ", ";
    70     }
    71     cout << "]"<<endl;
    72     //cout << arrary[i] << endl;
    73     //cout << y << endl;
    74     system("pause");
    75     return 0;
    76 }

    Factorial Trailing Zeroe

      题目:

      Given an integer n, return the number of trailing zeroes in n!.

      给定一个整数n,求n!中0的个数

      思路:

      我的思路:刚开始将题目理解错误,当成求n!了

      leetcode/dicuss思路:思路一:求0的个数,就是找10的个数,就是找2*5的个数,2出现的次数一定比5多,所以是5的个数决定的个数。那就求n中5个数。

                思路二:假设n=100,100/5=20,但是100中并不是有20个5 ,而应该20/5=4,20+4=24个5.

      代码1:思路1

     1 class Solution {
     2 public:
     3     int trailingZeroes(int n) {
     4         int res=0;
     5         while(n){    //为什么要迭代
     6             n/=5;
     7             res+=n;
     8         }
     9         return res;
    10     }
    11 };

      代码2:代码2

    class Solution {
    public:
        int trailingZeroes(int n) { 
            int count = 0;
            for (long long i = 5; n / i; i *= 5)
                count += n / i;
            return count;
        }
    };

      大牛的解释:https://leetcode.com/discuss/42624/4-lines-4ms-c-solution-with-explanations

      Well, to compute the number of trailing zeros, we need to first think clear about what will generate a trailing 0? Obviously, a number multiplied by 10 will have a trailing 0 added to it. So we only need   to find out how many 10's will appear in the expression of the factorial. Since 10 = 2 * 5 and there are a bunch more 2's (each even number will contribute at least one 2), we only need to count the   number of 5's.

      Now let's see what numbers will contribute a 5. Well, simply the multiples of 5, like 5, 10, 15, 20, 25, 35, .... So is the result simply n / 5? Well, not that easy. Notice that some numbers may      contribute more than one 5, like 25 = 5 * 5. Well, what numbers will contribute more than one 5? Ok, you may notice that only multiples of the power of 5 will contribute more than one 5. For      example,   multiples of 25 will contribute at least two 5's.

      Well, how to count them all? If you try some examples, you may finally get the result, which is n / 5 + n / 25 + n / 125 + .... The idea behind this expression is: all the multiples of 5 will contribute   one 5, the multiples of 25 will contribute one more 5 and the multiples of 125 will contribute another one more 5... and so on. Now, we can write down the following code, which is pretty short.

      带main函数跑的代码:

     1 #include "stdafx.h"
     2 #include "iostream"
     3 using namespace std;
     4 
     5 class MyClass
     6 {
     7 public:
     8     int  FactorialTrailingZeroes(int n)
     9     {
    10         int res = 0;
    11         //cout << res << endl;
    12         for(int i = 5; i < n ; i *= 5)
    13         {
    14             //cout << i << endl;    //测试
    15             res += n / i;
    16             //cout << res << endl;
    17         }
    18         return res;
    19     }
    20 };
    21 
    22 class While
    23 {
    24 public:
    25     int  FactorialTrailingZeroes(int n)
    26     {
    27         int res = 0;
    28         while (n)
    29         {
    30             n = n/5;
    31             res += n;
    32         }
    33         return res;
    34     }
    35 };
    36    
    37 int _tmain(int argc, _TCHAR* argv[])
    38 {
    39     //MyClass solution;
    40     While solution;
    41     int nums ;
    42     int m = 0;
    43     cin >> nums;
    44     m = solution.FactorialTrailingZeroes(nums);    //32,33行写反了,所以进不了for循环
    45     cout << m << endl;
    46     system("pause");
    47     return 0;
    48 }

      

  • 相关阅读:
    CompoundButton.OnCheckedChangeListener与RadioGroup.OnCheckedChangeListener冲突
    C# String.Format格式化json字符串中包含"{" "}"报错问题
    在IHttpHandler中获取session
    你真的会玩SQL吗?删除重复数据且只保留一条
    activity结束之后刷新之前的activity的内容
    jQuery打造智能提示插件二(可编辑下拉框)
    byte数组转float 以及byte转其他类型时为什么要&0xff
    为什么byte的取值范围是-128到127
    MySQL修改表、字段、库的字符集及字符集说明
    MySQL分布式jdbc连接
  • 原文地址:https://www.cnblogs.com/zhuzhu2016/p/5500333.html
Copyright © 2011-2022 走看看