思路:如果当最大值与最小值之间的差距大于2k的时候,此时最大值与最小值最小差距应该为max_value-k,min_value+k.最终的结果是:res = max_value-min_value-2k。如果当距离小于2k的时候,无论如何都能到0。所以代码比较简单
class Solution {
public:
int smallestRangeI(vector<int>& A, int K) {
if(A.size()==1||A.size()==0) return 0;
sort(A.begin(),A.end());
if(A[A.size()-1]-A[0]>=2*K) return A[A.size()-1]-A[0]-2*K;
else
return 0;
}
};
思路:直接暴力,估计有更好地方法
class Solution {
public:
bool divid(int num)
{
int tmp_value = num;
while(tmp_value%10)
{
if(tmp_value%10==0&&tmp_value/10!=0) return false;
int divid = tmp_value%10;
if(num%divid!=0) return false;
tmp_value/=10;
}
if(tmp_value%10==0&&tmp_value/10!=0) return false;
return true;
}
vector<int> selfDividingNumbers(int left, int right) {
vector<int> res;
for(int i=left;i<=right;i++)
{
if(divid(i)) res.push_back(i);
}
return res;
}
};
思路:暴力
class Solution {
public:
int addDigits(int num) {
while(num>=10)
{
int sum = 0;
while(num)
{
sum+=num%10;
num/=10;
}
num = sum;
}
return num;
}
};
思路二:a,b,c三个数字组成n=a*100+b*10+c,m=a+b+c,那么m与n相差a*99+b*9,所以m-n=9*(11*a+b)
代码为
class Solution {
public:
int addDigits(int num) {
if(num==0) return num;
int res = num%9;
if(res>0) return res;
else return 9;
}
};
思路:直接暴力
class Solution {
public:
int titleToNumber(string s) {
int sum = 0;
for(int i=0;i<s.length();i++)
{
sum=sum*26+(s[i]-'A'+1);
}
return sum;
}
};
思路:直接暴力。。。
class Solution {
public:
int romanToInt(string s) {
unordered_map<char,int> map;
map['I'] = 1;
map['V'] = 5;
map['X'] = 10;
map['L'] = 50;
map['C'] = 100;
map['D'] = 500;
map['M'] = 1000;
int res = 0;
for(int i=0;i<s.length();i++)
res+=map[s[i]];
for(int i=1;i<s.length();i++)
{
if(map[s[i]]>map[s[i-1]])
res-=2*map[s[i-1]];
}
return res;
}
};
思路:存储每个1的位置,然后求一个最大的位置的点就可以了。
class Solution {
public:
int binaryGap(int N) {
int ans = 0;
int last = -1;
for(int i=0;i<32;i++)
{
if (((N >> i) & 1) > 0)
{
if(last>=0)
{
ans = max(i-last,ans);
}
last = i;
}
}
return ans;
}
};
思路:一点小技巧,首先可以优化到(n/2),发现还是超时,然后可以优化到sqrt(n),值得注意的是需要在res不仅仅需要加i,还需要加num/i
class Solution {
public:
bool checkPerfectNumber(int num) {
int res = 1;
if(num%2) return false;
for(int i=2;i*i<=num;i++)
{
if(num%i==0) res+=i+num/i;
}
return res==num;
}
};
class Solution {
public:
int reachNumber(int target) {
int t = abs(target);
int step = 0;
int dist = 0;
while(dist<t)
{
step++;
dist+=step;
}
int dt = dist-t;
if(dt%2==0) return step;
else
{
if(step%2==0) return step+1;
else
return step+2;
}
}
};
思路:公式,1+2+3+...(2n-1)= n*n,所以挨个减去奇数,如果为0就是完全平方数
class Solution {
public:
bool isPerfectSquare(int num) {
int i = 1;
while(num>0)
{
num-=i;
i+=2;
}
return num==0;
}
};
思路:二分
思路:神仙题,做过一次就会了吧。
思路:暴力
class Solution {
public:
bool isUgly(int num) {
if(num<=1) return num==1;
while(num%2==0) num/=2;
while(num%3==0) num/=3;
while(num%5==0) num/=5;
return num==1;
}
};