算法------

系列文章目录

1.反转字符串

在这里插入图片描述
在这里插入图片描述

C

char* solve(char* str ) {
    // write code here
    char *f, *r;
    char temp;
    f = r = str;
    if(*str == ' ')
        return str;
    while(*r != '\0')
        r++;
    r--;
    while(r - f > 0){
        temp = *r;
        *r = *f;
        *f = temp;
        f++;
        r--;
    }
    return str;
    
   
}

java

import java.util.*;


public class Solution {
    /**
     * 反转字符串
     * @param str string字符串 
     * @return string字符串
     */
    public String solve (String str) {
        // write code here
        int j = 0;
        char[] s2 = new char[str.length()];
        for(int i = 0; i < str.length(); i++){
            s2[j++] = str.charAt(str.length()-1-i); 
        }
        
        return new String(s2);
       
    }
}

2.最大公约数

在这里插入图片描述

在这里插入图片描述

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 求出a、b的最大公约数。
     * @param a int 
     * @param b int 
     * @return int
     */
    public int gcd (int a, int b) {
        // write code here
        int t;
        if(a < b)
        {
            t = a;
            a = b;
            b = t;
        }
        while(b > 0){
            t = a % b;
            a = b;
            b = t;
        }
        return a;
            
    }
}

3.反转链表

在这里插入图片描述

public class Solution {
    public ListNode ReverseList(ListNode head)
    {
          public class Solution {
    public ListNode ReverseList(ListNode head)
    {
           ListNode pre = null;
           ListNode next = null;
           while(head != null){
               next = head.next;
               head.next = pre;
               pre = head;
               head = next;
           }
           return pre;
    }
}
   

4.两数之和

给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。
(注:返回的数组下标从1开始算起)

要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)
例如:
给出的数组为 [20, 70, 110, 150] , 目标值为90

返回一个数组 [1,2] ,因为 numbers _1+numbers _2=20+70=90

踩到一个小坑

//错误代码
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
   
    int i, j;
    int a[2];
    int flag = 0;
    for( i = 0; i < numbersLen - 1; i++)
    {
        for( j = i + 1; j < numbersLen; j++)
        {
            if(target - numbers[i] - numbers[j] == 0)
            {
                a[0] = i+1;
                a[1] = j+1;
                flag = 1;
                break;
            }
        }
        if(flag == 1)
            break;
    }
    *returnSize = 2;            //问题函数里面定义的的数组,如果要返回这个数组的指针,那么我在main里面调用这个指针会是空吗
    
    return a;
}

————————————————————————————————
【error】这里返回的指针指向的是在函数内定义的数组,函数结束这个数组的生命周期就结束了,所以指针就有问题了。

—————————————————————————————————

//正确
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
   
    int i, j;
    int a[2];
    int flag = 0;
    for( i = 0; i < numbersLen - 1; i++)
    {
        for( j = i + 1; j < numbersLen; j++)
        {
            if(target - numbers[i] - numbers[j] == 0)
            {
                a[0] = i+1;
                a[1] = j+1;
                flag = 1;
                break;
            }
        }
        if(flag == 1)
            break;
    }
    *returnSize = 2;            //问题函数里面定义的的数组,如果要返回这个数组的指针,那么我在main里面调用这个指针会是空吗
    numbers[0] = a[0];
    numbers[1] = a[1];
    return numbers;
}

————————————————————————————
success
发现传过来的指向数组的指针可用,拿来吧你。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脆皮瞎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值