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