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;
}