【2022.12.22每天四个简单题之简单题大智慧系列11】( 求1+2+…+n,在O(1)时间删除链表结点,合并两个排序的链表,把字符串转换成整数 )

求1+2+…+n

求 1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句 (A?B:C)。

数据范围
1≤n≤50000。

样例
输入: 10

输出: 55
我们可以通过定义一个短路表达式来实现此题,这样就不用再使用语句以及加减法
“&&”符号,如果前面的那一项不成立,就不会做后面的那一项,可以用它来代替if——else语句
c++

class Solution {
public:
    int getSum(int n) {
        int res=n;
        n>0&&(res+=getSum(n-1));
        return res;
    }
};

java

class Solution {
    public int getSum(int n) {
        int res = n;
        boolean flag = n > 0 && (res += getSum(n - 1)) > 0;
        return res;
    }
}

在O(1)时间删除链表结点

给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。

假设链表一定存在,并且该节点一定不是尾节点。

数据范围
链表长度 [1,500]。

样例
输入: 链表 1->4->6->8
删掉节点:第2个节点即6(头节点为第0个节点)

输出: 新链表 1->4->8
这个题告诉了我们链表节点后我们要删除自己,由于是单链表,我们不能找到前驱节点,所以我们不能按常规方法将该节点删除。
我们可以换一种思路,将下一个节点的值复制到当前节点,然后将下一个节点删除即可。
c++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    void deleteNode(ListNode* node) {
        node->val=node->next->val;
        node->next=node->next->next;
    }
};

当然我们也可以这样
java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public void deleteNode(ListNode node) {
        ListNode p = node.next;
        node.val=p.val;
        node.next=p.next;
    }
}

合并两个排序的链表

输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。

数据范围
链表长度 [0,500]。

样例
输入: 1->3->5 , 2->4->5

输出: 1->2->3->4->5->5
由于是两个递增链表,故而我们可以用双指针法,比较两组链表的起始值,将较小者放入新链表中,并让较小者的指针向后移一位,若有一个链表提前移完,就将剩下那个的后半部分全部接到新链表的后面

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* merge(ListNode* l1, ListNode* l2) {
        auto dummy=new ListNode(-1),tail=dummy;
        while(l1&&l2){
            if(l1->val<l2->val){
                tail=tail->next=l1;
                l1=l1->next;
            }else{
                tail=tail->next=l2;
                l2=l2->next;
            }
        }
        if(l1)tail->next=l1;
        if(l2)tail->next=l2;
        return dummy->next;
    }
};

java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode merge(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(-1);
        ListNode cur = dummy;

        while (l1 != null && l2 != null) {
            if (l1.val <= l2.val) {
                cur.next = l1;
                cur = cur.next;
                l1 = l1.next;
            } else {
                cur.next = l2;
                cur = cur.next;
                l2 = l2.next;
            }
        }

        if (l1 != null) cur.next = l1;
        else cur.next = l2;

        return dummy.next;
    }
}

把字符串转换成整数

请你写一个函数 StrToInt,实现把字符串转换成整数这个功能。

当然,不能使用 atoi 或者其他类似的库函数。

数据范围
输入字符串长度 [0,20]。

样例
输入: “123”

输出: 123
注意:

你的函数应满足下列条件:

  • 忽略所有行首空格,找到第一个非空格字符,可以是 ‘+/−’ 表示是正数或者负数,紧随其后找到最长的一串连续数字,将其解析成一个整数;
  • 整数后可能有任意非数字字符,请将其忽略;
  • 如果整数长度为 0,则返回 0;
  • 如果整数大于 INT_MAX(231−1),请返回 INT_MAX;如果整数小于INT_MIN(−231) ,请返回 INT_MIN;

对于此题,我们首先先把所有的空格都过滤掉,及设置一个k,使得如果是空格,就让k++
接下来我们找到最长的一串数字并将他存下来,当然这其中k也要++,如果要是负数,就设置一个负号
最后我们判断他与最大和最小值的大小判断输出即可(若是负数就乘负一)
c++

class Solution {
public:
    int strToInt(string str) {
        int k = 0;
        while (k < str.size() && str[k] == ' ') k ++ ;
        long long res = 0;

        int minus = 1;
        if (k < str.size())
        {
            if (str[k] == '-') minus = -1, k ++ ;
            else if (str[k] == '+') k ++ ;
        }
        while (k < str.size() && str[k] >= '0' && str[k] <= '9')
        {
            res = res * 10 + str[k] - '0';
            if (res > 1e11) break;//放置溢出此时必然不在范围内,就让他出来先让他变为真实值
            k ++ ;
        }

        res *= minus;
        if (res > INT_MAX) res = INT_MAX;
        if (res < INT_MIN) res = INT_MIN;

        return res;
    }
};

java同理

class Solution {
    public int strToInt(String str) {
        str = str.trim();
        if (str.length() == 0) return 0;
        int sign = 1;
        char first = str.charAt(0);
        if (first == '+' || first == '-') {
            if (first == '-') sign = -1;
            str = str.substring(1);
        }

        long res = 0;
        for (char c: str.toCharArray()) {
            if (c < '0' || c > '9') break;
            int x = c - '0';
            res = res * 10 + x;
            if (res > 1e11) break;
        }

        res *= sign;

        if (res > Integer.MAX_VALUE) res = Integer.MAX_VALUE;
        if (res < Integer.MIN_VALUE) res = Integer.MIN_VALUE;

        return (int)res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想进步的22级本科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值