1.写出下面程序的结果。
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char **cp[] = {c+3,c+2,c+1,c};
char ***cpp = cp;
printf("%s\n",**++cpp); //POINT
printf("%s\n",*--*++cpp+3); //ER
printf("%s\n",*cpp[-2]+3); //ST
printf("%s\n",cpp[-1][-1]+1); //EW
看到这种题型,大部分人都应该一阵窃喜,这种类型的题目只需要通过画图就可以解决。
1、**++cpp
首先++cpp,cpp指向cp首地址,++指向c+2的地址,先得到数组cp的第二个元素c+2,解引用++cpp也就是(c+2),指向数组c的第三个地址,再解引用((c+2))就得到POINT。
2、–++cpp+3
根据符号优先级,首先是++cpp,由于1里面cpp已经指向了数组cp的第二个元素地址,所以这里++cpp就指向数组cp的第三个元素地址;然后解引用++cpp得到数组cp的第三个元素c+1,然后–++cpp相当于–(c+1),也就是得到c,而c里面存的是数组c的首元素地址,再解引用*c得到数组c的首元素ENTER,加3就从E开始向后数3,就是E输出就是ER。
3、*cpp[-2]+3
上面1和2的操作之后,cpp目前指向数组cp的第三个元素地址,cpp[-2]就相当于指向数组cp的第一个元素地址,解引用*cpp[-2]得到c+3所指的FIRST,加3就从F开始向后数3就是S,输出就是ST。
4、cpp[-1][-1]+1
此时cpp 指向数组cp的第三个元素c+1,cpp[-1]指向数组cp的第二个元素c+2,再执行cpp[-1][-1]相当于(c+2)[-1],也就是(c+2-1),也就是(c+1),得到数组c的第二个元素地址,是NEW地址,加1从N往后数1就是EW地址,输出EW。
- 给定一个字符串S,求所有长度小于3的子串出现的次数,输出结果按出现次数从大到小排序,如果次数相同,按字典序排序。比如,给定字符串”abcdab”,输出结果为
a 2
ab 2
b 2
abc 1
bc 1
bcd 1
c 1
cd 1
cda 1
d 1
da 1
dab 1
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;
vector<pair<string,int>>& calculate3Gram(string s)
{
if(s.size() != 0)
{
map<string,int> mp;
for(int i = 0; s[i] != '\0'; ++i)
{
map<string,int>::iterator it;
string temp(1,s[i]);
if(s[i] != '\0')
{
it = mp.find(temp);
if(it == mp.end())
mp[temp] = 1;
else
mp[temp]++;
}
if(s[i+1] != '\0')
{
temp += s[i+1];
it = mp.find(temp);
if(it == mp.end())
mp[temp] = 1;
else
mp[temp]++;
}
if(s[i+2] != '\0')
{
temp += s[i+2];
it = mp.find(temp);
if(it == mp.find(temp))
mp[temp] = 1;
else
mp[temp]++;
}
}
map<string,int>::iterator it = mp.begin();
int i = 0;
for(; it != mp.end(); ++it)
{
cout<<it->first<<" "<<it->second<<endl;
i++;
}
vector<pair<string,int>> *ve = new vector<pair<string,int>>[i];
for(it = mp.begin(); it != mp.end(); ++it)
{
it = mp.begin();
int max = it->second;
map<string,int>::iterator it2 = mp.begin(),it3 = it;
while(it2 != mp.end())
{
if(max < it2->second)
it3 = it2;
++it2;
}
pair<string,int> value(it3->first,it3->second);
mp.erase(it3);
ve->push_back(value);
}
cout<<"----------------"<<endl;
return *ve;
}
}
int main()
{
string str("abcdab");
vector<pair<string,int>> ve;
ve = calculate3Gram(str);
for(int i = 0; i < ve.size(); ++i)
cout<<ve[i].first<<" "<<ve[i].second<<endl;
}