leet code每日一题(C语言版)

一、Two Sum

        题目大意:在数组中找到2个数字之和等于给定的数字,结果返回2个数字的数组下标。

        例如:给定数组[2,7,11,15],目标值9,2+7=9,返回[0,1].。

        思路:利用两个循环,第一个循环,用目标值减去当前数组值,用第二个循环在剩下的数组                      值中寻找,是否存在。

   void TwoSum(int input){
		int target = input;
		int arr[9] = {1,2,3,4,5,6,7,8,9};
		int res = 0;
		char flag = 0; 
		for(int i=0; i<9;i++){
			res = target - arr[i];
			for(int j=i+1; j<9;j++){
				if(res == arr[j]){
					printf("数组下标为:[%d,%d]\n",i,j);
					flag +=1;
				}
			}
		}
		if(flag == 0){
		  printf("结果不存在\n");
		}
		
   }

二、Longest Substring Without Repeating Characters

        题目大意:在一个字符串中寻找没有重复字母的最长字符串。

        例如:“abcabcbb”   结果为abc,最长为3。

        思路:设定两个下标left,right。left<right,利用i在left和right之间游走。当下标i的字符与下     标right的字符相同时,left加1,同时right加1。知道字符串遍历完成。类似于滑动窗口的算法。

   void Findlongstring(void){
   		char arr[10] ;           //必须输入10个字符 
   		int left=0 ,right=0; 
   		int max  = 0;
   		int a,b,i;
   		printf("请输入字符串\n"); 
   	    scanf("%s",arr);
		while(right<sizeof(arr)){		
			if(left<right){
				for(i=left;i<right;i++){        //i逐渐逼近right
					if(arr[i]==arr[right]){     //两个字符相同时记录
						if(max<right-left){     
							max = right-left;
						    a = left;
						    b = right;
						}						
						left+=1;           
						break;
					}
				}
				right+=1;	
			}else{
				right +=1;
			}			
		}
		if(left == 0){
			max = right-left;
			a = left;
			b = right;
		} 
   	    printf("最长为:%d\n",max);
		printf("字符串为:\n");
		for(int j=a;j<b;j++){
			printf("%c",arr[j]);
		} 
   }

        三、Reverse Integer

                 题目大意:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反       转。注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

                例如:给定123,返回321。

  void Reverse_num(void){
  	int val = 0;
  	printf("请输入一个整数\n");
	scanf("%d",&val);   
  	int res = 0;
  	while(val!=0){
  		res = res*10 + val%10;          //除以10取余再乘以10
  		val = val/10;                   //原值除以10
	}
	if(res> 1<<(31-1) || res<-(1<<31)){
		printf("ERROR\n");

	}	
	printf("Reverse_num is %d:\n",res);
  }

        四、Palindrome

        题目大意:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序

                        (从右向左)   读都是一样的整数。注意会有负数的情况,负数,个

                          位数,10 都不是回文数。其他的整数再按照回文的规则判断。

        例如:121,是。-121,不是。

   int IsPalindrome(void){
   	int val,tmp = 0;
   	int cnt = 0;
  	printf("请输入一个整数\n");
	scanf("%d",&val); 
	tmp = val;
	if(val<10){
		printf("No\n");
		return 0;
	}
	//确定几位数
	while(val!=0){
		val = val /10;
		cnt+=1;
	}
	//存入数组
	int arr[cnt]={0};
	for(int i=0;i<cnt;i++){
		arr[i] = tmp%10;
		tmp =tmp/10;
	}
	for(int j=0;j<cnt;j++){
		printf("%d ",arr[j]);
	}
    //前后相比较
	for(int k=0;k<cnt/2;k++){
		if(arr[k] != arr[cnt-1-k]){
			printf("No\n");
			return 0;
		}
	}
	printf("Yes\n");	
   } 

        五、Container With Most Water

                题目大意:给出一个非负整数数组 a1,a2,a3,...... an,每个整数标识一个竖立在

                                 坐标轴 x 位置的一堵高度为 ai的墙,选择两堵墙,和 x 轴构成的容器可

                                以容纳最多的水。

                例如:input[1,8,6,2,5,4,8,3,7]

                           output:49  

   void MaxArea(void){
   		int length,a;
   		int left=0,right=0;
   		int maxval,tmp;
   		int area=0;
   		int j = 0;                    //应该没用到
   		printf("请输入数组的大小\n");
		scanf("%d",&length);
		int arr[length] = {0};
		
		printf("请输入数组值!\n");
		for(int i=0;i<length;i++){
			scanf("%d",&arr[i]);
		} 
		for(left=0;left<length-1;left++){      //两个循环,类似于冒泡
			for(right=left+1;right<length;right++){
				if(arr[left]<arr[right]){      //取最小值
					tmp = arr[left];
				}else{
					tmp = arr[right];
				}
				area = tmp*(right-left);        //两个数之间的间距
				if(area>maxval){
					maxval=area;
				}
			}
		}		
		printf("MaxArea is: %d\n",maxval);
		 
   }

六、Roman to Integer

       題目大意:羅馬數字包含以下种字符:I,V,X,L,C,D和M。分别代表1,5,10,50,

                        100,500,1000。先给定一串罗马字符串,请将它用数字打印出来。例如:

                        输入 LVIII 输出:58。

        思路:将给定的字符串存入字符数组中,通过遍历的方式将其转换成整型数组。组后进

                   行累加计算。需注意,通常情况下,罗⻢数字中小的数字在大的数字的右边。但

                  也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数

                   等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。

   void RomanToInteger(void){
   		char arr[7] = {'I','V','X','L','C','D','M'};
   		int  buf[7] = {1,5,10,50,100,500,1000};
   		int  cnt = 0;
   		int sum = 0;
   		int z = 0;
	   	char *p = (char*)malloc(1024);
	   	printf("请输入字符串:\n") ; 
	   	gets(p);
	   	int len = strlen(p);
	   	printf("len: %d\n",len);                //打印输入的字符串 长度 
	   	printf("p: %s\n",p);                    //打印输入的字符串
	   	char str[len] = {0};
	   	int  tsrr[len] = {0};                    
	   	strncpy(str,p,len);
//	   	printf("str:%c\n",str[2]);              //打印拷贝后的字符数组 
		for(int i=0;i<len;i++){
			for(int j=0;j<7;j++){
				if(str[i]==arr[j]){
					tsrr[i] = buf[j];
				}
			}
		}				
	   	while(z<len){
	   		if((tsrr[z]<tsrr[z+1])&&(z+1<len)){    //防止下标越界 
	   			sum =sum + tsrr[z+1] - tsrr[z];
	   			z+=2;
			}else{
				sum = sum + tsrr[z];
				z= z+1;
			}
		}
		printf("结果为:%d\n",sum);	   	
	    if(p!=NULL){
	   		free(p);
	   }  	
   }
   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值