Leetcode--easy系列7

本文深入探讨了算法与数据结构的关键概念及其在实际场景中的高效应用,包括但不限于回文字符串判断、版本号比较、多数元素查找等核心问题。通过详细解析算法逻辑与优化策略,旨在提升读者的编程技能与解决复杂问题的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#125 Valid Palindrome

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

For example,
"A man, a plan, a canal: Panama" is a palindrome.
"race a car" is not a palindrome.

Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.

For the purpose of this problem, we define empty string as valid palindrome.

判断给定字符串是否是回文字符串,注意判定中忽略空格和标点(判断字符和数字),不区分字母大小写

设置2个指针i和j 进行首尾移动


//6ms
bool isPalindrome(char* s) {
    int i,j,len;
    len = strlen(s);
    if(len==0||len==1)
        return true;
    i=0;
    j=len-1;
    while(i<=j)
    {
        while(!((s[i]>='A' && s[i]<='Z') || (s[i]>='a' && s[i]<='z')) && !(s[i]>='0' && s[i]<='9'))//不是数字 或字母
           { 
               i++;
               if(i>len-1)
                    return true; 
           }
            
        while(!((s[j]>='A' && s[j]<='Z') || (s[j]>='a' && s[j]<='z')) && !(s[j]>='0' && s[j]<='9'))//不是数字 或字母
            {
                j--;
                if(j<0)
                    return false;
            }
        if(i==j)
            return true;
        if( ((s[i]>='A' && s[i]<='Z') || (s[i]>='a' && s[i]<='z'))  && ((s[j]>='A' && s[j]<='Z') || (s[j]>='a' && s[j]<='z')) )//都是字母
        {
            if(s[i]==s[j] || s[i]==s[j]+32 || s[j]==s[i]+32)//不区分大小写
            {
                i++;
                j--;
            }
            else
                return false;
        }
        else if( (s[i]>='0' && s[i]<='9') && (s[j]>='0' && s[j]<='9') )//都是数字
        {
            if(s[i]==s[j])
            {
                i++;
                j--;
            }
            else
                return false;
        }
        else
            return false;

    }
    return true;
}
一个更清晰的写法如下:

//4ms
bool isPalindrome(char* s) {
    int len = strlen(s);
    for (int i = 0, j = len - 1; i < j; i++, j--) 
    { 
        while ( (!isalnum(s[i]))  && i < j ) //isalpha(c)或isdigit(c)
            i++; 
        while ( (!isalnum(s[j])) && i < j ) 
            j--;
        if (toupper(s[i]) != toupper(s[j])) 
            return false;
    }
    return true;
}

#165 Compare Version Numbers

Compare two version numbers version1 and version2.
If version1 > version2 return 1, if version1 < version2 return -1, otherwise return 0.

You may assume that the version strings are non-empty and contain only digits and the . character.
The . character does not represent a decimal point and is used to separate number sequences.
For instance, 2.5 is not "two and a half" or "half way to version three", it is the fifth second-level revision of the second first-level revision.

Here is an example of version numbers ordering:

0.1 < 1.1 < 1.2 < 13.37
比较版本大小:比较对应以'.'分开的数

有2种直观想法,对于两个版本数,一个方法时是根据从最前面开始取数,一个一个比较大小,只有两个数相等才继续比较下一个数,否则返回比较结果

另一种是先将这两个版本的所有数取出放在数组里,再一一对应比较大小。

下面分别给出两种方法的代码。由于Java API中存在字符串以给定字符划分的函数,给出JAVA实现。

//0ms
int compareVersion(char* version1, char* version2) {
	int i,j;
    int num1=0,num2=0;//记录以'.'分开的数字
	int start1=0,start2=0;
	int len1 = strlen(version1);
	int len2 = strlen(version2);

	while(start1<len1 && start2<len2)
	{
		num1 = 0;
		num2 = 0;
		
		for(i=start1; i<len1 && version1[i]!='.'; i++)
			num1 = (version1[i]-'0')+num1*10;
		
		for(j=start2; j<len2 && version2[j]!='.'; j++)
			num2 = (version2[j]-'0')+num2*10;

		if(num1 == num2)
		{
			start1 = i+1;//从下一个'.'开始比较下一个数字
			start2 = j+1;
		}
		else if(num1 > num2)
			return 1;
		else if(num1 < num2)
			return -1;
	}
	//特例"1.0" = "1"
	if(i==len1 && j==len2)
		return 0;
	else if(i==len1 && j<len2)
	{
		//判断j后的所有num是否为0,若为0 返回=,否则返回-1
		num2 = 0;
		while(start2<len2)
		{
			for(j=start2; j<len2 && version2[j]!='.'; j++)
				num2 = (version2[j]-'0')+num2*10;
			if(num2!=0)
				return -1;
			num2 = 0;//置0,下一次判断
			start2++;
		}
		return 0;
	}
		
	else if(i<len1 && j==len2)
	{
			//判断j后的所有num是否为0,若为0 返回=,否则返回-1
		num1 = 0;
		while(start1 < len1)
		{
			for(i=start1; i<len1 && version1[i]!='.'; i++)
				num1 = (version1[i]-'0')+num1*10;
			if(num1!=0)
				return 1;
			num1 = 0;//置0,下一次判断
			start1++;
		}
		return 0;
	}
}

//0ms
int compareVersion(char* version1, char* version2) {
	int nums1[200]={0},nums2[200]={0};//先假设版本号最多有5个
	int start1=0,start2=0;//指向每一个char
	int len1 = strlen(version1);
	int len2 = strlen(version2);
	int i;
	int size1=0,size2=0;
	int temp=0;//数字
	while(start1 < len1)
	{
		for(i=start1; i<len1 && version1[i]!='.'; i++)
			temp = (version1[i]-'0')+temp*10;
		if(i!=start1)//!!!
			nums1[size1++] = temp;
		temp = 0;//置0,下一次计算
		start1 = i+1;;
	}
	while(start2 < len2)
	{
		for(i=start2; i<len2 && version2[i]!='.'; i++)
			temp = (version2[i]-'0')+temp*10;
		if(i!=start2)
			nums2[size2++] = temp;
		temp = 0;//置0,下一次计算
		start2 = i+1;
	}
	//比较nums1[]和nums2[]的每一个元素
//	temp = (size1>size2)?(size1-1):(size2-1);
	for(i=0; i<200;i++)
	{
		if(nums1[i] > nums2[i])
			return 1;
		else if(nums1[i] < nums2[i])
			return -1;
	}
	return 0;
}
public class Solution {
    public int compareVersion(String version1, String version2) {
        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");

        int longest = v1.length > v2.length? v1.length: v2.length;

        for(int i=0; i<longest; i++)
        {
            int ver1 = i<v1.length? Integer.parseInt(v1[i]): 0;
            int ver2 = i<v2.length? Integer.parseInt(v2[i]): 0;

            if(ver1> ver2) return 1;
            if(ver1 < ver2) return -1;
        }
        return 0;
    }
}


#169 majority Element

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

n个元素的数组,某个元素至少重复  ⌊ n/2 ⌋ + 1  个 ,找出该元素。

任意两个不同的元素相消,最后剩下的即为该元素。也可以先排序,再取中间元素

//8ms

int majorityElement(int* nums, int numsSize) {
    int major = nums[0];//初值
    int count = 1;
    int i;
    for(i = 1; i<numsSize; i++)
    {
        if(nums[i]==major)//如果相同,计数+1
            count++;
        else
        {
            count--;//如果不同,计数-1,直到为0,则重置新的major
            if(count==0)
            {
                major = nums[i];
                count = 1;
            }
        }
    }
    return major;
}

#171 Excel Sheet Column Number

Given a column title as appear in an Excel sheet, return its corresponding column number.

For example:

    A -> 1
    B -> 2
    C -> 3
    ...
    Z -> 26
    AA -> 27
    AB -> 28 

类似进制转换

//4ms
int titleToNumber(char* s) {
    int len,i,j=0,num=0;
	len = strlen(s);

	for(i=len-1;i>=0;i--)
	{
		num += (s[i]-'A'+1)*pow(26,j);
		j++;
	}
	return num;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值