部分力扣题解&丢丢知识点

一.题解

1.力扣1053.交换一次的先前排列:

题目如下:

首先我们要读清题目,该题要求只交换一次的同时,要得到按字典序排列小于原数组的最大排列(切记不要求出不符合要求的数组,如字典序最小的数组或是多次交换得到的数组)

利用贪心,从后向前枚举至第一个非递减的位置,同时在遍历的元素中寻找一个比当前元素小并且差值最小并且距离最近的元素进行替换,保证替换后的arr字典序尽可能大。

代码如下:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* prevPermOpt1(int* arr, int arrSize, int* returnSize) { 
 
   int max,count,i,n=0;
    *returnSize=arrSize;
    for(i=arrSize-2;i>=0;--i)
    {
        max=0;
        n=i;
        for(int j=i+1;j<arrSize;++j)
        {
            if(arr[j]<arr[i]&&arr[j]>max)
            {
                max=arr[j];                                                                                                             
                n=j;
            }
        }
        if(n!=i)
        {count=arr[n];
       arr[n]=arr[i];
       arr[i]=count;
       break;
        }
    }
    return arr;
}


2.力扣11盛水最多的容器:

题目如下:

思路:双指针解法

在初始时,左右指针分别指向数组的左右两端,它们可以容纳的水量为 min⁡(1,7)∗8=8\min(1, 7) * 8 = 8min(1,7)∗8=8。

此时我们需要移动一个指针。移动哪一个呢?应该移动对应数字较小的那个指针(即此时的左指针)。这是因为,由于容纳的水量是由两个指针指向的数字中较小值∗指针之间的距离决定的。如果我们移动数字较大的那个指针,那么前者「两个指针指向的数字中较小值」不会增加,后者「指针之间的距离」会减小,那么这个乘积会减小。因此,我们移动 数字较小的那个指针。

代码如下:

int maxArea(int* height, int heightSize) {
    int max=0,min=0,s=0;int j=heightSize-1;int i=0;
    while(i<j){
        if(height[i]<height[j])
        min=height[i++];
        else min=height[j--];
        s=(j-i+1)*min;
        if(max<s)
        max=s;
    }
    
return max;
}

二.知识点

先来一些废话,上周的任务是文件的学习,抛去文件指针,文件相关函数(打开,关闭,读写,指针移动),相对路径与绝对路径等等等,文件好像也没什么可说的了,在这里我们不讲解详细知识,只说遇到的一个问题

上代码:

#include<stdio.h>
int main()
{
	FILE * pf1 = fopen("D:\\txxt.txt","w");
	char arr[10]="天天开心";
	fputs(arr,pf1); 
	fclose(pf1);
	FILE * pf2 = fopen("D:\\txxt.txt","r");
while(1){
if(feof(pf2))
	break;
printf("%c",(unsigned char)fgetc(pf2));
	
}
	fclose(pf2);
}

运行效果如下:

由图可见,代码并没有完全达到我们想要的效果,它比预期多出一个方框,这是怎么回事呢?

其实是由if语句的判断条件造成的

feof ( )函数:

函数原型:
int feof(FILE * stream);
所在头文件:
stdio.h
返回值:
返回非零值代表已到达文件尾
函数说明:
feof ( ) 用来侦测是否读取到了文件尾, 尾数stream 为fopen()所返回之文件指针. 如果已到文件尾则返回非零值, 其他情况返回0

及feof只能用于侦测是否读取到了文件尾,无法确定在文件中停止读取的位置

方框的出现是因为读入了字符串末尾的'\0'

可以修改代码为:

#include<stdio.h>
int main()
{
	FILE * pf1 = fopen("D:\\txxt.txt","w");
	char arr[10]="天天开心";
	fputs(arr,pf1); 
	fclose(pf1);
	FILE * pf2 = fopen("D:\\txxt.txt","r");
//while(1){
//if(fgetc(pf2)==0)
//	break;
printf("%s",fgets(arr,10,pf2));
	
//}
	fclose(pf2);
}

#include<stdio.h>
int main()
{
	FILE * pf1 = fopen("D:\\txxxt.txt","w");
	char arr[10]="天天开心";
	fputs(arr,pf1); 
	fclose(pf1);
	FILE * pf2 = fopen("D:\\txxxt.txt","r");
while(1){
int ch=fgetc(pf2);
if(ch==EOF)
	break;
printf("%c",(unsigned char)ch);
	
}
	fclose(pf2);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值