LC:字符串转换整数 (atoi) + 外观数列 + 最长公共前缀 + 回文链表

1. 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
返回整数作为最终结果。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var s = "-91283472332";
        var myAtoi = function(s) {
            s = s.trim();
            var sign = 1;
            var index = 0;
            if(s.length<0) return 0 ;
            if(s[index]==='+' || s[index]==='-'){
                if(s[index]==='-')
                    sign = -1;
                index++;
            }
            var res = 0;
            while(index<s.length){
                if(s.charCodeAt(index)-'0'.charCodeAt(0)<0||s.charCodeAt(index)-'0'.charCodeAt(0)>9)
                    break;
                else{
                    res = Number(res * 10) + Number(s[index]);
                }
                index++;
            }
            if((res>(Math.pow(2,31) - 1))&&sign>0)
                return Math.pow(2,31) - 1;
            if((res>Math.pow(2,31))&&sign<0)
                return -Math.pow(2,31);
            return res * sign;
        };
        console.log(myAtoi(s)); //-2147483648
    </script>
</body>
</html>

2. 给定一个正整数 n ,输出外观数列的第 n 项。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

你可以将其视作是由递归公式定义的数字字符串序列:

1. 1

2. 11

3. 21

4. 1211

5. 111221

6. 312211

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var countAndSay = function(n) {
            if(n==1) return '1';
            var s = countAndSay(n-1);
            var num = 0;
            var str = '';
            var count = 0;
            var flag = 0;
            for(var i=0;i<s.length;i++){
                if(s[i]==s[num]){
                    count++;
                    flag = 0;
                }
                else{
                    flag = 1;
                    str += count + s[num];
                    num = i;
                    i = num - 1;
                    count = 0;
                }
            }
            if(!flag)
                str+= count + s[num];
            return str;
        }
        console.log(countAndSay(6)); //312211
    </script>
</body>
</html>

3. 编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        strs = ["flower","flow","flight"]; 
        var longestCommonPrefix = function(strs) {
            var pre = strs[0];
            var i = 1;
            while(i<strs.length) {
                while(strs[i].indexOf(pre)!=0)
                    pre = pre.slice(0,pre.length-1);
                i++;
            }
            return pre; //fl
        };
    </script>
</body>
</html>

4. 给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false 。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *reverseList(struct ListNode* head){
    struct ListNode *p=head;
    struct ListNode *q;
    head=NULL;
    while(p){
        q=p->next;
        p->next=head;
        head=p;
        p=q;
    }
    return head;
}

bool isPalindrome(struct ListNode* head){
    struct ListNode *p=head;
    struct ListNode *q=head;
    int count=0;
    int i=0;
    int j=0;
    while(q){
        count++;
        q=q->next;
    }
    if(count==1)
        return true;
    q=head;
    if(count%2==0){
        while(i<count/2){
            q=q->next;
            i++;
        }
    }else if(count%2!=0){
        while(i<count/2+1){
            q=q->next;
            i++;
        }
    }
    q=reverseList(q);
    while(j<count/2){
        if(p->val!=q->val)
            return false;
        p=p->next;
        q=q->next;
        j++;
    }
    return true;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值