题目一:搜索插入位置(难度:简单)
思路:直接通过二分查找,时间复杂度即为O(log n);返回应插入的位置即为左边界的值。
int searchInsert(int* nums, int numsSize, int target){
int low=0;
int high=numsSize-1;
while(low<=high){
int mid=(high+low)/2;
if(nums[mid]==target){
return mid;
}
else if(nums[mid]<target){
low=mid+1;
}
else if(nums[mid]>target){
high=mid-1;
}
}
if(target>nums[0])
return low;
return 0;
}
题目二:最后一个单词的长度(难度:简单)
思路:反向遍历字符串,但出现字母时计数,直到下一个空格为止
class Solution {
public:
int lengthOfLastWord(string s) {
int index=0,flag=0;
for(int i=s.length()-1;i>=0;i--){
if(s[i]!=' '){
flag=1;
index++;
continue;
}
else if(flag==1) break;
}
return index;
}
};
题目三:字符串中的单词数(难度:简单)
思路:先查看字符串是否为空串,再看字符串开头是否有空格,若有计数先自减1;之后遍历数组,每个字母前有空格则计数自加1
class Solution {
public:
int countSegments(string s) {
if(s.length()==0) return 0;
int index=1;
if(s[0]==' ') index--;
for(int i=0;i<s.length()-1;i++){
if(s[i]==' '&&s[i+1]!=' ') index++;
}
return index;
}
};
题目三:回文素数(难度:中等)
思路:分别判断该数是否为回文和素数,长度为8的数可以直接跳过,因为没有长度为8的素数
int rev(int num){
int a[10]={};
int i=0;
while(num!=0){
a[i++]=num%10;
num/=10;
}
for(int j=0;j<i/2;j++){
if(a[j]!=a[i-j-1])
return 0;
}
return 1;
}
int prime(long long int num){
int flag=0;
for(long long int i=2;i<=num/2;i++){
if(num%i==0) {
flag=1;break;
}
}
if(flag==0)
if(num<2)return 0;
else return 1;
else return 0;
}
int func(long long int a){
for(;;a++){
if(a>=10000000&&a<=99999999) continue;
if(rev(a)&&prime(a)){
return a;
}
}
}
int primePalindrome(int n){
int a=func(n);
return a;
}
题目五:颜色分类(难度:中等)
void sortColors(int* nums, int numsSize){
int indexA=0;
int indexB=0;
int indexC=0;
for(int i=0;i<numsSize;i++){
if(nums[i]==0){
indexA++;
}
else if(nums[i]==1){
indexB++;
}
else indexC++;
}
for(int i=0;i<indexA;i++){
nums[i]=0;
}
for(int i=0;i<indexB;i++){
nums[indexA+i]=1;
}
for(int i=0;i<indexC;i++){
nums[indexA+indexB+i]=2;
}
}