leetcode0725

1、买卖股票的最佳时期

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 

int maxProfit(vector<int>& prices) {
        int ans=0;
        for(int i=1;i<prices.size();i++){
          if(prices[i]>prices[i-1]){
            ans+=prices[i]-prices[i-1];
          }
        }
        return ans;
    }

2、验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true

class Solution {
public:
    bool isPalindrome(string s) {
    string str;
      for(int i=0;i<s.length();i++){
        if(isalnum(s[i])){
          str+=tolower(s[i]);
        }
      }
      int len=str.length();
      for(int i=0;i<len/2;i++){
        if(str[i]!=str[len-i-1]){
          return 0;
        }
      }
        return 1;
  }
};

3、只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

int singleNumber(vector<int>& nums) {
      //异或的特性
      //0异或x=x
      //x异或b=b
      //b异或b=0
      int res=0;
      for(int i=0;i<nums.size();i++){
        res^=nums[i];
      }
      //最后返回的为落单的
      return res;
    }

4、环形链表

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

 bool hasCycle(ListNode *head) {
      if(head==NULL||head->next==NULL)return false;
      ListNode *fast=head->next;
      ListNode *slow=head;
      while(fast!=slow){
        if(fast->next==NULL||fast->next->next==NULL)return false;
        fast=fast->next->next;
        slow=slow->next;
      }
      return true;
    }

5、相交链表

编写一个程序,找到两个单链表相交的起始节点。

如下面的两个链表

在节点 c1 开始相交。

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int lenA=0,lenB=0;
        ListNode *pA=headA;
        ListNode *pB=headB;
        while(pA!=NULL){
          pA=pA->next;
          lenA++;
        }
        while(pB!=NULL){
          pB=pB->next;
          lenB++;
        }
        pA=headA;
        pB=headB;
        int diff=lenA-lenB;
        if(diff>0){
          int step=diff;
          while(step>0){
            pA=pA->next;
            step--;
          }
        }else if(diff<0){
          int step=-diff;
          while(step>0){
            pB=pB->next;
            step--;
          }
        }
        while(pB!=pA){
          pA=pA->next;
          pB=pB->next;
        }
        return pA;
    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值