MT1506 (字符串哈希)
我的答案
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s1;
cin>>s1;
int len = s1.size();
map <char,int> mymap;
for(int i = 0;i<s1.size();i++)
{
mymap[s1[i]]++;
}
vector <int> res;
for (auto [key,value]:mymap)
{
res.push_back(value);
}
int result = 0;
for (int i = 0; i<s1.size(); i++)
{
result = max(res[i],result);
}
cout<<len-result;
return 0;
}
标准答案:
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char s[100000];
int cnt[3];
cin.getline(s,100000);
int len = strlen(s);
for(int i = 0;i < len; i++)
cnt[s[i]-'1']++;
int ans = 0;
for(int i = 0;i < 3;i++){
ans = max(cnt[i],ans);
}
printf("%d",len-ans);
return 0;
}
这个答案要比我写的更精简,思想是“字符串哈希”,已经遇到好几个这种题了,但为啥老是学不会这个方法.....
MT1524
有疑问的点:
①怎么不使用strlen( )而把这一道题写出来???【看了一眼答案恍然大悟】
下面是答案的代码:
#include<bits/stdc++.h>
using namespace std;
//这个char *mystrcat刚开始没看懂,其实char* mystrcat这样就会很好懂,即:该函数返回一个指针
char *mystrcat(char *s1,char *s2) {
char *p = s1;
while(*p !='\0')
p++;
while(*s2!='\0')
*(p++) = *(s2++);
*p = '\0';
return s1;
}
int main( )
{
char s1[10000] ="",s2[5000] = "";
cin.getline(s1, 10000);
cin.getline(s2, 5000);
mystrcat(s1, s2);
cout<<s1;
return 0;
}
MT1526
有疑问的点:
①一串字符串,比如“Weeeendy is a great girl”,写程序的时候,怎么避免第一个e的结果输出之后,后面的e不会再去输出结果
解决方法:让后面的e全部变为空格。【不得不说这是一个极好的方法】
②怎么避免输出空格
最初,我用了下面这种方法,让ch[k] == " ",但是报错显示操作数类型不兼容。我也没寻找解决办法,而是用了另一种笨方法。【后来发现把双引号变成单引号就ok了。。。。】
就是这种,我又搞了一个字符数组char ppp,数组只存放了一个空格。
我的答案:
#include <bits/stdc++.h>
using namespace std;
void frequency(char *ch,int n)
{
int k=0;
for (int k = 0; k < n; k++)
{
int result = 1;
if (ch[k] == ' ') continue;
for (int i = k+1; i < n; i++)
{
if(ch[i]==' ' ) continue;
if(ch[i] == ch[k])
{
result += 1;
ch[i]=' ';
}
}
if(result>=2)
{cout<<ch[k]<<" "<<result<<endl;}
}
}
int main()
{
/*这个最初我设置的是999,发现不通过,检查了几遍代码没什么问题,发现答案写的是10000,我改成10000之后就ok了,真好家伙!!*/
const int length = 10000;
char s[length];
cin.getline(s,length);
int n = strlen(s);
frequency(s,n);
return 0;
}
MT1527
我的答案
#include<bits/stdc++.h>
using namespace std;
bool flag = true;
int main()
{
string s;
cin>>s;
char* p1 = s;
char* p2 = s+s.size()-1;
while(p1<p2)
{
if(*p1!=*p2)
{
flag = false;
break;
}
else{p1++;p2--;}
}
if(flag == false) cout<<"NO";
else cout<<"YES";
return 0;
}
MT1540
我的答案:
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[100], n;
int *p = a;
cin >> n;
int even = 0, odd = 0;
for(int i = 0; i< n;i++) cin>>*(p+i);
for(int i = 0; i< n; i++){
if(i%2 == 1)
odd += *(p+i);
else
even += *(p+i);
}
if(odd ==even)
cout << "YES";
else
cout << "NO";
return 0;
}
题目的意思就是,让我能够用指针去指向数组,然后for循环中也去使用*(p+i)去表示。【或者说用*(p+i)代替 a[i] 】
MT1550
我的答案:
#include<bits/stdc++.h>
using namespace std;
int main( )
{
string month[12] = {"january","february","march","april","may","june","july","august","september","october","november","december"};
int n;
string *p = month;
cin>>n;
cout<<*(p+n-1);
return 0;
}
字符串数组,以及字符指针的定义:string *p
MT1552
关键词:指针数组,字符串排序
需要清楚的知道,
字符指针数组怎么存储字符串的?
方法一:char s1[10][100],以这种二维数组的方式;
方法二:这种方法需要new空间,声明一个指针只会创建一个指针变量,它并没有指向具体的内存空间。你需要显式地为指针分配内存空间,才能确保可以存储数据。
char* s1[10];
for (int i = 0; i < 10; i++)
{
s1[i] = new char[10];
cin.getline(s1[i], 10);
}
我的答案:
#include <bits/stdc++.h>
using namespace std;
int main()
{
char s1[10][100];
for (int i = 0; i < 10; i++)
{
cin.getline(s1[i],10);
}
for (int j = 0; j < 10; j++)
{
for (int i = j+1; i < 10; i++)
{
if(strcmp (s1[j],s1[i])>0)
{swap(s1[j],s1[i]);}
}
}
for (int i = 0; i < 10; i++)
{
cout<<s1[i]<<endl;
}
return 0;
}
MT1555
我的答案:
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int length,target,index = -1;
cin>>length;
int a[length];
int* p = a;
for (int i = 0; i < length; i++)
{
cin>>p[i];
}
cin>>target;
for (int i = 0; i < length; i++)
{
if(p[i]==target)
{
index=i;
break;
}
}
cout<<index<<endl;
return 0;
}
MT1556
当一个人被杀死之后,怎么更新下一个人的序号为1
想到用链表(循环链表)
-----待写
力扣.383(也用到了字符串哈希)
我的代码:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
map <char,int> mymap;
for(int i = 0;i<magazine.size();i++)
{
mymap[magazine[i]]++;
}
for(int j = 0;j<ransomNote.size();j++)
{
mymap[ransomNote[j]]--;
}
//注意for内的语句
for(auto& it:mymap)
{
if(it.second<0) return false;
}
return true;
}
};
在 for
循环语句中,使用 auto&
来声明迭代器变量 it
,表明它是一个引用类型,而不是值类型。这意味着在循环过程中,通过 it
访问的值将直接引用原始容器中的值,可以修改它们的值或属性,而不仅仅是复制一份副本。
答案代码:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int hash[26] = {0};
for(char c:ransomNote){
++hash[c-'a'];
}
for(char c:magazine){
--hash[c-'a'];
}
for(int i = 0;i<26;i++){
if(hash[i]>0){
return false;
}
}
return true;
}
};