• Leetcode--easy系列1


    近期開始刷Leetcode题目。花了一个星期先完毕了easy难度级别的题目,easy级别的题目思路比較简单,但不一定就直接AC了,主要是问题要考虑全然。特别是对特殊情况的处理。


    #6 ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

    P   A   H   N
    A P L S I I G
    Y   I   R
    

    And then read line by line: "PAHNAPLSIIGYIR"

    这个题主要是将一个Z型排列的字符串变为按行排列。关键是:找到位置关系。第一行和最后一行因为奇数列少一个元素,要特别处理。

    1输出第一行

    2输出中间其它行

    3输出最后一行 

    char* convert(char* s, int numRows) {
        int i,j;
        int slen=0;
        char *ps;
        char *temp; 
    	slen=strlen(s);
    	ps = (char *)malloc(sizeof(char)*(slen+1));
    	temp = ps;
    	if(slen==1||numRows==1)
    		return s;
    	for(i=0; i<numRows; i++)
    	{
    		if(i==0 || i==numRows-1)//第一行或最后一行单独处理
    		{
    			for(j = 0; i+j <slen ; )
    			{
    				*temp = s[i+j];
    				temp++;
    				j = j + 2*(numRows-1);
    			}
    		}
    		else
    		{	//中间行
    			for(j = 0;j<slen;j++)
    			{
    				//偶数列 (i,j)相应 j*(numRows-1)+i 
    				if( (j&1 == 0) &&  ((j*(numRows-1)+i) < slen)  )
    				{
    					*temp = s[j*(numRows-1)+i];
    					temp++;
    				}
    				//奇数列
    				else if( ( j&1 == 1) && ((numRows-1)*(j+1)-i) < slen )
    				{
    					*temp = s[(numRows-1)*(j+1)-i];
    					temp++;
    				}
    			}
    		}
    	}
    	ps[slen]='';
    	return ps;
    }
    #7 Reverse Interger

    Reverse digits of an integer.

    Example1: x = 123, return 321
    Example2: x = -123, return -321

    这个题我写了例如以下2种方法

    int reverse(int x) {
        int out = 0;
        while(x!=0)
        {
            if( abs(out) > 214748364 )
                return 0;
            out = out*10 + x%10;<pre name="code" class="cpp">//也能够用if(out/10 != pre_out) return 0;
    x /= 10; } return out;}
    
    
    int reverse(int x) {
        int y=(x>0)?

    x:(-1*x); int a[10]={0};//依次存储个位 十位。。。

    最大20亿。

    多少位? int i,len=0; unsigned int out=0; while(y!=0) { a[len] = y%10; y=y/10; if(y!=0) len++; } for(i=0;i<=len;i++) { out = out + (int)(a[i]*pow(10,len-i)); if( out > INT_MAX ) return 0; } return (x>0)?out:(-1*out); }


    #8 String  to Interger (atoi)

    Implement atoi to convert a string to an integer.

    Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

    这个题可谓经典,用字符串存储int。输出数字。前前后后写了上十个版本号才AC。要考虑的特例情况主要例如以下:

    case input --string excepted--int
    1 “      +1”    1
    2 "+-2" 0
    3 “     010” 10
    4 “     -0012a42” -12
    5 "     +0   123" 0
    6 "99999999999" 0

    要考虑的问题有 1 符号位,数分为有符号和无符号数。字符串可能带符号,符号有且仅仅能有一个且仅仅能出如今第一个非空格位置处;

          2字符串前面有空格。字符串中间有空格等

           3数字越界,无效输入

           4必须为数字

    /*
    *4ms
    */
    int myAtoi(char* str) {
        int i=0,j=0,r=0;
    	int flag=1;//符号位 1或-1
    	int count=0;//符号位个数
    	int old;
    	if(str=="")
    		return 0;
    
    	while(str[j]==' ') //前面的空格 不处理
    		j++;
    
    	for(i=j;str[i]!='';i++)
    	{
    		if(str[i]=='-')
    		{
    			flag = -1;
    			count++;
    			if(count>1)//连续出现符号位 
    				return 0;
    			continue;
    		}
    		else if(str[i]=='+')
    		{
    			count++;
    			if(count>1)//连续出现符号位 
    				return 0;
    			continue;
    		}
    		else if(str[i]>=48 && str[i]<=57)//数字
    		{
    			old = r;
    			r = r*10 + str[i]-48;
    	    	if(r/10 != old)//越界
    			{
    				if(flag==-1)
    					return INT_MIN;
    				else
    					return INT_MAX;
    			}
    		}
    		else if((str[i]<48||str[i]>57))//遇到非数字(包括中间的空格)
    			return  flag*r;
    	}
    	return flag*r;
    }


    int myAtoi(char* str) {
        int result = 0;
        int last_re;
        int sign;
        if(str == NULL)
            return -1;
        while(*str==' ')
            str++;
        sign = (*str == '-')? -1 : 1;
        if(*str == '+'|| *str == '-' )
            str++;
        while(*str >='0' && *str <='9')
        {
            last_re = result;
            result = result * 10 + (*str - '0');
            if(result/10 != last_re)
    			{
    				if(sign == -1)
    					return INT_MIN;
    				else
    					return INT_MAX;
    			}
            str++;
        }
        return result*sign;
    }


    #9 Palindrome Number

    Determine whether an integer is a palindrome. Do this without extra space.

    这个题能够利用 题#7反转数字来推断

    bool isPalindrome(int x) {
      /*
        int a = x, h=1;
    	while (a/h >=10)
    		h = h*10;
    	if( a<0 )
    	    return false; 
    	
    	while(a>0)
    	{
    		if(a/h != a%10)
    			return false;
    		a = a%h; //去掉前面已经比較位
    		a = a/10; //去掉后面已经比較位
    		h = h/100; //一次去掉2位置,h的长度也被减小2位置
    	}
    	return true;
    	*/
    	int a = x, r = 0;
    	if(a<0)  //特殊情况
    		return false;
    	
    	while(a>0)
    	{
    		r = r*10 + a%10;
    		a = a/10;
    	}
    	return r==x;
    }

    然后写它下一次。

  • 相关阅读:
    Koa初探
    npm 安装electron 失败的问题和解决办法
    vscode常用快捷键
    docker 执行TP 的 migrate数据库迁移报错2002
    git删除历史记录中的大文件详解
    js replace 替换路径无效的问题
    window.prompt()方法数据类型问题
    scorecardpy 介绍
    CatBoost 使用
    webgl
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5035727.html
Copyright © 2020-2023  润新知