力扣第四天

C语言刷力扣

一 .有序数组删除重复项

二.罗马数字转整数

三.蓝桥杯(单词分析)

四.思路

用双指针实现(一)

如果数组中的长度为0,则数组不包含任何数则直接返回0;
给定的数组是有序的所以一定满足i<j,如果

nums[i] == nums[j]

,则对任意都有

*nums[i] = =nums[k] ==nums[j]*

即相等的元素在数组中的下标一定都是连续的,利用数组有序的特点所以使用双指针的方法来删除相等元素;

设置两个指针一个快指针fast和一个慢指针slow

初始值都为1,*nums[fast]*先遍历整个数组,从下标1到n-1;
如果遍历完后没有一个数和nums[fast]一样,说明没有和nums[fast]相同的数,因此将nums[fast]的数复制到nums[slow],slow++即指向下一个位置,然后fast再加一继续查找

(二)

这道题目不同的是如果左边的数小于右边就要减去左边的数,例如 IV=4,因为I=1,V=5,所以IV=5-1等于四;(这题想了好久 我他妈好菜)

(三)

用a[s[i]] 记录每个单词的个数在进行比较

代码(一)
int removeDuplicates(int* nums, int numsSize){
	if(numsSize==0)
	{
		return  0;
	}
	
	int fast = 1;
	int slow = 1;
	while(fast < numsSize)
	{
		if(nums[fast]!=nums[fast-1])//这边是fast-1
		{
			nums[slow] = nums[fast];
			++slow;
		}
		++fast;
	} 
	return slow;
}
代码(二)
int getnum(char s)
{
    int num;
    switch(s)
    {
        case 'I' :num = 1;break;
        case 'V' :num = 5;break;
        case 'X' :num = 10;break;
        case 'L' :num = 50;break;
        case 'C' :num = 100;break;
        case 'D' :num = 500;break;
        case 'M' :num = 1000;break;
    }
    return num;
}

int romanToInt(char * s){
    int ans = 0;
    int n = strlen(s);
    for(int  i = 0;i<n;i++)
    {
        int temp = getnum(s[i]);
        if(i<n-1 && temp<getnum((s[i+1])))
        {
            ans = ans - temp;
        }
        else
        {
            ans = ans + temp;
        }
        
    }
    return ans;
}
代码(三)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
  int a[128] = {0};//记录各个单词的次数
  char s[10000+1];
  scanf("%s",s);
    int len=strlen(s);
  int max = 0;
  char  t = 0;
  for(int i =0;i<len;i++)
  {
    a[s[i]]++;
    if(a[s[i]]>max)
    {
      max = a[s[i]];
      t = s[i];
    }
    else if(max == a[s[i]])
    {
      if(t>s[i])
      {
        t = s[i];
      }
    }
  }
  printf("%c\n%d",t,max);

  return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值