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