• 牛客题霸题解


    题目:字符串距离计算

    题解:

    这个题暴力就好了,三层循环枚举哪个字符转换成哪个字符,然后将第一个串中的所有该字符替换,再比较两个串中不同的字符有多少个,每次更新最小值就好了。

    代码:

     1 class Solution {
     2 public:
     3     /**
     4      * 计算最少的距离
     5      * @param S1 string字符串 第一个字符串
     6      * @param S2 string字符串 第二个字符串
     7      * @return int整型
     8      */
     9     int GetMinDistance(string S1, string S2) {
    10         // write code here
    11         int ans=0x3f3f3f;
    12         for(int k=0;k<26;k++){
    13             for(int l=0;l<26;l++){
    14                 int cnt=0;
    15                 string s=S1;
    16                 for(int i=0;i<s.size();i++){
    17                     if(s[i]-'a'==k) s[i]='a'+l;
    18                     if(s[i]!=S2[i]) cnt++;
    19                 }
    20                 ans=min(ans,cnt);
    21             }
    22         }
    23         return ans;
    24     }
    25 };
    View Code
     

    题目:牛妹的蛋糕

    题解:

    因为每天吃掉剩余的1/3+1,到n天只剩1,所以倒推相当于前一天吃掉的是当天的(x+1)*3/2,公式推出来直接求解即可,不会爆long long。 。

    代码:

     1 class Solution {
     2 public:
     3     /**
     4      * 
     5      * @param n int整型 只剩下一只蛋糕的时候是在第n天发生的.
     6      * @return int整型
     7      */
     8     int cakeNumber(int n) {
     9         // write code here
    10         int ans=1;
    11         for(int i=1;i<n;i++){
    12             ans++;
    13             ans*=3;
    14             ans/=2;
    15         }
    16         return ans;
    17     }
    18 };
    View Code

    题目: 最少素数拆分

    题解:

    如果本身就是素数的话,那么直接输出1就好了;
    按照哥德巴赫的猜想:
    如果这个数是偶数,那么输出2;
    奇数的情况可以分成2+N-2,如果N-2是一个质数的话,那么输出2,否则输出3。

    代码:

     1 class Solution {
     2 public:
     3     /**
     4      * 判断给定的正整数最少能表示成多少个素数的和
     5      * @param N int整型 给定的正整数
     6      * @return int整型
     7      */
     8  
     9     int MinPrimeSum(int N) {
    10         // write code here
    11         int n=sqrt(N);
    12         int flag=1;
    13         for(int i=2;i<=n;i++){
    14             if(N%i==0){
    15                 flag=0;
    16                 break;
    17             }
    18         }
    19         if(flag) return 1;
    20         flag=1;
    21         for(int i=2;i<=n;i++){
    22             if((N-2)%i==0){
    23                 flag=0;
    24                 break;
    25             }
    26         }
    27         if(flag||N%2==0) return 2;
    28         return 3;
    29     }
    30 };
    View Code

    题目: 神奇的数字

    题解:

    一开始看成了偶数位,,导致一直过不去样例...
    就将偶数存起来,然后翻转偶数串,再遍历一遍原串,遇到偶数就将翻转后的位置的字符放上去。

    代码:

     1 class Solution {
     2 public:
     3     /**
     4      * 
     5      * @param number string字符串 
     6      * @return string字符串
     7      */
     8     string change(string number) {
     9         // write code here
    10         string ans;
    11         for(int i=0;i<number.size();i++){
    12             if((number[i]-'0')%2==0) ans+=number[i];
    13         }
    14         reverse(ans.begin(),ans.end());
    15         int k=0;
    16         for(int i=0;i<number.size();i++){
    17             if((number[i]-'0')%2==0) number[i]=ans[k++];
    18         }
    19         return number;
    20     }
    21 };
    View Code

    题解:

    看数据范围n*m复杂度肯定是不行的,所以要用二分,变成mlogn就可以了。先给a数组排个序,因为二分得是有序的数组才行。然后二分第一个比他大的位置坐标和第一个比他小的位置坐标,取两个位置和x[i]差值的最小值,将每次的答案存入vector中。

    代码:

     1 class Solution {
     2 public:
     3     /**
     4      * 远亲不如近邻
     5      * @param n int整型 居民个数
     6      * @param m int整型 方案个数
     7      * @param a int整型vector 居民的位置
     8      * @param x int整型vector 方案对应的位置
     9      * @return int整型vector
    10      */
    11     vector<int> solve(int n, int m, vector<int>& a, vector<int>& x) {
    12         // write code here
    13         sort(a.begin(),a.end());
    14         vector<int>ans;
    15         for(int i=0;i<m;i++){
    16             int l=0,r=n-1;
    17             int res=n-1;
    18             while(l<=r){
    19                 int mid=l+r>>1;
    20                 if(a[mid]>=x[i]){
    21                     r=mid-1;
    22                     res=mid;
    23                 }
    24                 else l=mid+1;
    25             }
    26             int p=abs(a[res]-x[i]);
    27             l=0,r=n-1;
    28             res=0;
    29             while(l<=r){
    30                 int mid=l+r>>1;
    31                 if(a[mid]<=x[i]){
    32                     l=mid+1;
    33                     res=mid;
    34                 }
    35                 else r=mid-1;
    36             }
    37             p=min(p,abs(a[res]-x[i]));
    38             ans.push_back(p);
    39         }
    40         return ans;
    41     }
    42 };
    View Code

    题目:  打字

    题解:

    用栈模拟就好了,每次遇到'<' 判断一下栈是否为空,不为空就栈顶出栈,如果字符不为'<'就往战力

    代码:

     1 class Solution {
     2 public:
     3     /**
     4      * 
     5      * @param s string字符串 
     6      * @return string字符串
     7      */
     8     string Typing(string s) {
     9         // write code here
    10         stack<char>q;
    11         string ans;
    12         for(int i=0;i<s.size();i++){
    13             if(s[i]=='<') {if(!q.empty()) q.pop();}
    14             else q.push(s[i]);
    15         }
    16         while(!q.empty()){
    17             ans+=q.top();
    18             q.pop();
    19         }
    20         reverse(ans.begin(),ans.end());
    21         return ans;
    22     }
    23 };
    View Code

    题目: 车站建造问题

    题解:

    如果本身就是素数或者1的话,那么答案+1;
    按照哥德巴赫的猜想:
    如果这个数是偶数,那么答案+2;
    奇数的情况可以分成2+N-2,如果N-2是一个质数的话,那么答案+2,否则答案+3。
    这不就是上边的素数分解题目!
    最后答案要加一个车站,因为算的是区间的距离,比车站个数少一个。

    代码:

     1 class Solution {
     2 public:
     3     /**
     4      * 
     5      * @param n int整型 
     6      * @param a int整型一维数组 
     7      * @param aLen int a数组长度
     8      * @return int整型
     9      */
    10     int MinPrimeSum(int N) {
    11         // write code here
    12         int n=sqrt(N);
    13         int flag=1;
    14         for(int i=2;i<=n;i++){
    15             if(N%i==0){
    16                 flag=0;
    17                 break;
    18             }
    19         }
    20         if(flag||N==1) return 1;
    21         flag=1;
    22         for(int i=2;i<=n;i++){
    23             if((N-2)%i==0){
    24                 flag=0;
    25                 break;
    26             }
    27         }
    28         if(flag||N%2==0) return 2;
    29         return 3;
    30     }
    31      
    32     int work(int n, int* a, int aLen) {
    33         // write code here
    34         int ans=n;
    35         for(int i=0;i<n-1;i++){
    36             int p=a[i+1]-a[i];
    37             ans+=MinPrimeSum(p);
    38             ans--;
    39         }
    40         return ans;
    41     }
    42 };
    View Code

    题目: 牛妹的礼物

    题解:

    简单dp。
    状态转移方程为dp[i][j]=min(dp[i][j], dp[i-1][j], dp[i][j-1], dp[i-1][j-1]);
    如果dp从1开始的话就要初始化一下dp[0][i]和dp[i][0]为前缀和,当然从0开始的话只要判断边界能不能走就好了。

    代码:

     1 class Solution {
     2 public:
     3     /**
     4      * 
     5      * @param presentVolumn int整型vector<vector<>> N*M的矩阵,每个元素是这个地板砖上的礼物体积
     6      * @return int整型
     7      */
     8     int dp[310][310];
     9     int selectPresent(vector<vector<int> >& presentVolumn) {
    10         // write code here
    11         int n=presentVolumn.size();
    12         int m=presentVolumn[0].size();
    13         for(int i=1;i<=n;i++){
    14             for(int j=1;j<=m;j++){
    15                 dp[i][j]=0x3f3f3f;
    16             }
    17         }
    18         for(int i=1;i<=n;i++) dp[i][0]=dp[i-1][0]+presentVolumn[i-1][0];
    19         for(int i=1;i<=m;i++) dp[0][i]=dp[0][i-1]+presentVolumn[0][i-1];
    20         for(int i=1;i<=n;i++){
    21             for(int j=1;j<=m;j++){
    22                 dp[i][j]=min(dp[i][j],dp[i-1][j]+presentVolumn[i-1][j-1]);
    23                 dp[i][j]=min(dp[i][j],dp[i][j-1]+presentVolumn[i-1][j-1]);
    24                 dp[i][j]=min(dp[i][j],dp[i-1][j-1]+presentVolumn[i-1][j-1]);
    25             }
    26         }
    27         return dp[n][m];
    28     }
    29 };
    View Code

    题目:牛牛算数

    题解:

    用从小到大排序的优先队列就可以快速的解决问题了。当优先队列的大小大于1时,就不断从中取出两个数,计算他们的和,再放入队列中,答案加上c*(x+y),直到队列大小为1,返回答案;

    代码:

     1 class Solution {
     2 public:
     3     /**
     4      * 返回一个数字表示输出计算n个数字和的最小花费的时间。
     5      * @param n int整型 表示有n个数。
     6      * @param c int整型 参数c
     7      * @param a int整型vector ai表示第i个数的大小
     8      * @return long长整型
     9      */
    10     long long solve(int n, int c, vector<int>& a) {
    11         // write code here
    12         long long ans=0;
    13         priority_queue<long long,vector<long long>,greater<long long > >q;
    14         for(int i=0;i<n;i++) q.push((long long )a[i]);
    15         while(q.size()>1){
    16             long long x=q.top();
    17             q.pop();
    18             long long y=q.top();
    19             q.pop();
    20             ans+=c*(x+y);
    21             q.push(x+y);
    22         }
    23         return ans;
    24     }
    25 };
    View Code

    题目: 分组

    题解:

    二分最大值就好了,二分判断的时候一直加数字直到大于等于最大值,组数+1,累计数值清零。如果最后组数大于k组,那么返回1,否则返回0。

    代码:

     1 class Solution {
     2 public:
     3     /**
     4      * 分组
     5      * @param n int整型
     6      * @param k int整型
     7      * @param a int整型vector
     8      * @return int整型
     9      */
    10  
    11     bool check(int k,int n,vector<int>a)
    12     {
    13         int cnt=0;
    14         int p=0;
    15         for(int i=0;i<a.size();i++){
    16             p+=a[i];
    17             if(p>=k) p=0,cnt++;
    18         }
    19         return cnt>=n;
    20     }
    21  
    22     int solve(int n, int k, vector<int>& a) {
    23         // write code here
    24         int l=0,r=1e9;
    25         int ans=0;
    26         while(l<=r){
    27             int mid=l+r>>1;
    28             if(check(mid,k,a)){
    29                 l=mid+1;
    30                 ans=mid;
    31             }
    32             else r=mid-1;
    33         }
    34         return ans;
    35     }
    36 };
    View Code
  • 相关阅读:
    如何设置范围,使透视数据源记录可以自适应地改变
    Atitit..文件上传组件选择and最佳实践的总结(2)----HTTP
    AIDL(1)
    最好的年龄减肥
    2012在数据库技术会议上的讲话PPT打包
    左右 Java 于 finally 深度分析语句块
    R0-R37它是Arm 寄存器,那是,CPU内部。和GPIO注册所有外设。换句话说,要是arm的cpu,它包含了其他芯片公司将有R0-R37,和GPIO寄存器只有一个特定的芯片。
    使用方便 正则表达式grep,sed,awk(一)
    经验36--C#无名(大事,物...)
    IOS 图片压缩
  • 原文地址:https://www.cnblogs.com/lilibuxiangtle/p/13922458.html
Copyright © 2020-2023  润新知