面试刷题2则

第一题:

/*
 * 绳子覆盖的最大长度,给定一个有序数组,表示在数轴之上,和一个距离L,求L覆盖数组中最多的元素个数
 * O(1)
 */
#include<iostream>
using namespace std;
int maxpoint1(int arr[],int L){
    int left =0;
    int right = 0;
    int max = 0;
    while (left<10)
    {
        while (right<10 && (arr[right]-arr[left])<=L)
        {
            right++;
        }
        //先运算后++
        int t = right-left;
        max = max>t?max:t;
        left++;    
    }
    return max;
}
int main(){
    int arr[]={1,2,4,6,9,12,14,15,16,17};
    int L = 4;
    int max  = maxpoint1(arr,L);
    cout<<"the max is :"<<max<<endl;
    return 0;
}

主要方法是:双指针法,灵活使用

第二题

/*
 * 给定一个字符串,字符串中包含无序的SB,
 * 现要求将所有的S移动到左边,所有的B移动到右边或者反之,求最小移动次数
 * 字符串如果为空,移动次数为0
 * O(1)
 */
#include<iostream>
#include<string>
using namespace std;
int minSteps(string S){
    int Length  = S.size();
    if(Length == 0){
        return 0;
    }
    int j = 0;
    int step1 = 0;
   for (int i = 0; i < Length; i++)
   {
       if(S[i]=='S'){
           step1+=i-j;
           j++;
       }
   }
   int k = 0;
   int step2 = 0;
   for (int i = 0; i < Length; i++)
   {
       if(S[i]=='B'){
           step2+=i-k;
           k++;
       }
   }
   return step1>step2?step2:step1;
}
int main(){
    string S("SBSSBSS");
    int min_steps = minSteps(S);
    cout<<"the min_steps is :"<<min_steps<<endl;
    return 0;
}

总结:也是双指针的使用,灵活使用

双指针,用于动态的数组或者链表等操作,有奇效!!!!

改进点:两个for循环,改成一个for循环

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值