1.第一个只出现一次的字符
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
简单题。①用数组存放字符,char转int ②用map<char,int>存储
class Solution {
public:
int FirstNotRepeatingChar(string str) {
map<char, int> mp;
for(int i = 0; i < str.size(); ++i)
mp[str[i]]++;
for(int i = 0; i < str.size(); ++i){
if(mp[str[i]]==1)
return i;
}
return -1;
}
};
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int ch[256]={0};
for(int i=0;i<str.size();i++)
{
ch[int(str[i])]++;
}
for(int i=0;i<str.size();i++)
{
if(ch[int(str[i])]==1)
{return i;
break;
}
}
return -1;
}
};
注意:要考虑return -1的情况。
2.数组中的逆序对-归并排序 时间复杂度O(nlogn)
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
class Solution {
public:
int InversePairs(vector<int> data) {
if(data.empty())
return 0;
vector<int>copy;
for(int i=0;i<data.size();i++)
copy.push_back(data[i]);
long long c= InversePairsCore(data,copy,0,data.size()-1);
return c%1000000007;
}
long long InversePairsCore(vector<int> &data,vector<int>& copy,int start,int end)
{
if(start==end)
{copy[start]=data[start];
return 0;
}
int length=(end-start)/2;
long long left=InversePairsCore(copy,data,start,start+length);
long long right=InversePairsCore(copy,data,start+length+1,end);
int i=start+length;
int j=end;
int k=end;
long long count=0;
while(i>=start&&j>=start+length+1)
{
if(data[i]>data[j])
{ count+=j-start-length;
copy[k--]=data[i--];
}
else
{
copy[k--]=data[j--];
}
}
for(;i>=start;i--)
copy[k--]=data[i];
for(;j>=start+length+1;j--)
copy[k--]=data[j];
return count+left+right;
}
};
注意:大数 long long
传引用而非传值
数组交换