leetcode-每日一题-全排列和字符串问题-58-46(dfs中等,字符串应用简单)-唯一纯c语言解

今天的这两道题第一道dfs我一直不明白题目给的另外两个指针的意义在哪,我不管怎么设置值两个返回的大小,最终的结果都会爆出是内存地址的问题,我一直搞不懂leetcode里面对于c语言的底层地址存储是怎么判断的,它里面的存储和其他c++,c sharp,java,python都不一样,题目的c语言解法很多次都是会多出两个指针,一个用来指向列一个用来指向行,说到底我还是不习惯leetcode的解题方式,写一个函数用来写人家特定的格式,很多次都是已经有思路了但是就是写不对,这个题我的stdout的结果是对的,但是输出到leetcode后台的内容就是有问题,大家可以看看我写的,顺便说一句这个题官方没有c语言解,而且我一般都不看官方的题解,出来困难题之外,一定要学会独立思考,独立解决问题的能力,毕竟都学了这么久的算法了。

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:

输入:nums = [1]
输出:[[1]]
 

提示:

1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
void dfs(int numsSize,int *flag,int i,int (*a)[6],int *nums,int *k,int *f)
{
    if(i==numsSize)
    {
        for(int j=0;j<numsSize;j++)
        {
            a[*flag][j]=k[j];
        }
        *flag+=1;
        return;
    }
    for(int l=0;l<numsSize;l++)
    {
        if(f[l]==0)
        {
            f[l]=1;
            k[i]=nums[l];
            dfs(numsSize,flag,i+1,a,nums,k,f);
            f[l]=0;
        }
    }
}
int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    int (*a)[6]=(int(*)[6])malloc(sizeof(int)*725*6);
    int *k=(int*)malloc(sizeof(int)*numsSize);
    int *f=(int*)malloc(sizeof(int)*numsSize);
    int flag=0;
    memset(a,0,sizeof(a));
    for(int j=0;j<numsSize;j++)
    {
        k[j]=0;
        f[j]=0;
    }
    dfs(numsSize,&flag,0,a,nums,k,f);
    for(int i=0;i<flag;i++)
    {
        for(int j=0;j<numsSize;j++)
        {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    printf("%d\n",flag);
    *returnSize = 0;
    *returnColumnSizes = malloc(sizeof(int) * (*returnSize));
    for (int i = 0; i < *returnSize; i++) {
        (*returnColumnSizes)[i] = numsSize;
    }
    return a;
}

当然了第二道题相对来说是比较简单的,题目上面说了一个字符串最少有一个单词,有一个小坑就是最后的结尾位置有可能是空格,所以这和需要你单独判断一下,按照咱们的正常逻辑肯定就是从最后面开始计算,所以咱们只需要把最后的单词后面的空格用一个特殊符号进行代替即可,然后我们在判断的时候进行一个设置就可以求出来,时间复杂度几乎为0因为就是一个单词的长度加上空格的长度,所以我的解在时间复杂度上面超过了所有的c提交者,但是空间复杂度一看就是o 1级别的啊,为啥它那边提交之后仅仅只是超过了百分之7,有点不理解,这道题要是再java里面的化,就会很简单,因为不需要大家去处理字符串,只要一个split函数把字符串切割后直接取最后的一个单词即可,ok看看我的提交过程和代码吧。

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

示例 1:

输入:s = "Hello World"
输出:5
解释:最后一个单词是“World”,长度为5。
示例 2:

输入:s = "   fly me   to   the moon  "
输出:4
解释:最后一个单词是“moon”,长度为4。
示例 3:

输入:s = "luffy is still joyboy"
输出:6
解释:最后一个单词是长度为6的“joyboy”。
 

提示:

1 <= s.length <= 104
s 仅有英文字母和空格 ' ' 组成
s 中至少存在一个单词

 java解(很少写,主要用java搭框架,写写后端和大数据):

class Solution {
    public int lengthOfLastWord(String s) {
        int sum;
        String[] str=s.split(" ");
        return str[str.length-1].length();
    }
}

 

 

 c语言解:

void fun(char *s)
{
    int i=strlen(s)-1;
    while(s[i]==' ')
    {
        s[i]='0';
        i--;
    }
}
int lengthOfLastWord(char * s){
    int sum=0,len_s=strlen(s),flag=0;
    fun(s);
    for(int i=len_s-1;i>=0;i--)
    {
        if(s[i]=='0')
        {
            continue;
        }
        while(s[i]!=' ')
        {
            sum++;
            if(i==0)
            {
                break;
            }
            i--;
        }
        break;
    }
    return sum;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

新城已无旧少年_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值