题目:字符串距离计算
题解:
这个题暴力就好了,三层循环枚举哪个字符转换成哪个字符,然后将第一个串中的所有该字符替换,再比较两个串中不同的字符有多少个,每次更新最小值就好了。
代码:
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 };
题目:牛妹的蛋糕
题解:
因为每天吃掉剩余的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 };
题目: 最少素数拆分
题解:
如果本身就是素数的话,那么直接输出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 };
题目: 神奇的数字
题解:
一开始看成了偶数位,,导致一直过不去样例...
就将偶数存起来,然后翻转偶数串,再遍历一遍原串,遇到偶数就将翻转后的位置的字符放上去。
代码:
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 };
题目:远亲不如近邻
题解:
看数据范围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 };
题目: 打字
题解:
用栈模拟就好了,每次遇到'<' 判断一下栈是否为空,不为空就栈顶出栈,如果字符不为'<'就往战力
代码:
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 };
题目: 车站建造问题
题解:
如果本身就是素数或者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 };
题目: 牛妹的礼物
题解:
简单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 };
题目:牛牛算数
题解:
用从小到大排序的优先队列就可以快速的解决问题了。当优先队列的大小大于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 };
题目: 分组
题解:
二分最大值就好了,二分判断的时候一直加数字直到大于等于最大值,组数+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 };