有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。
1.两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
解决方法:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int i,j=0,len,sum=0;
len = numsSize;
//创建一个新数组
int *result =NULL;
result = (int *)malloc(sizeof(int)*2);
while(j<len-1){
for(i=j+1;i<len;i++){
sum = nums[j]+nums[i];
if(sum==target){
result[0]=j;
result[1]=i;
*returnSize=2;
return result;
}else{
sum=0;
}
}
j++;
}
//返回长度
*returnSize=0;
return result;
}
9.回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例:
输入:x = 121
输出:true
解决方法:
bool isPalindrome(int x){
int x1=x;
long int y=0;
if(x<0)
return false;
while(x!=0){
y=x%10+y*10;
x=x/10;
}
if(x1==y)
return true;
return false;
}
13.罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
输入: s = "III"
输出: 3
解决方法:
int rback(char ch);
int romanToInt(char *s){
int sum=0;
int len =strlen(s);
for(int i=0;i<len;i++){
if(i!=len-1){
if(s[i]=='I'){
if(s[i+1]=='V'||s[i+1]=='X')//你只管继续加,我只管我自己的减
sum =sum-2;
}else if(s[i]=='X'){
if(s[i+1]=='L'||s[i+1]=='C')//你只管继续加,我只管我自己的减
sum =sum-20;
}else if(s[i]=='C'){
if(s[i+1]=='D'||s[i+1]=='M')//你只管继续加,我只管我自己的减
sum =sum-200;
}
}
sum =sum+rback(s[i]);
}
return sum;
}
int rback(char ch){
switch(ch) {
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
case 'a': return 4;
case 'b': return 9;
case 'c': return 40;
case 'd': return 90;
case 'e': return 400;
case 'f': return 900;
}
return 0;
}
26. 删除有序数组中的重复项
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
解决方法:
int removeDuplicates(int* nums, int numsSize){
int i=0;
if(numsSize<=1)
return numsSize;
for(int j=1;j<numsSize;j++){
if(nums[i]!=nums[j]){
nums[++i]=nums[j];
}
}
return i+1;
}
27. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例:
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
解决方法:
int removeElement(int* nums, int numsSize, int val){
int j=0;
for(int i =0;i<numsSize;i++){
if(nums[i]!=val){
nums[j++]=nums[i];
}
}
return j;
}
35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例:
输入: nums = [1,3,5,6], target = 5
输出: 2
解决方法:
int searchInsert(int* nums, int numsSize, int target){
int i;
for(i=0;i<numsSize;i++){
if(nums[i]>=target){
return i;
}
}
return i;
}
58. 最后一个单词的长度
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例:
输入:s = "Hello World"
输出:5
解释:最后一个单词是“World”,长度为5。
解决方法:
int lengthOfLastWord(char * s){
int i,count=0,flag=0;
int len = strlen(s);
for(i=len-1;i>=0;i--){//从后往前数
if(s[i]==' '){
if(flag==0)
count=0;
else
break;
}else{
count++;
flag=1;
}
}
return count;
}
20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号。
输入:s = "()[]{}"
输出:true
解决方法:
用数组模拟栈
char *s;
int top=-1;
if(top==-1)//栈为空先输入
s[top]=temp;
//入栈
top++;
s[top]=temp;
//出栈
top--;
bool isValid(char * s){
int i;
int temp;
int top = -1;//栈的标值
int len = strlen(s);
for(i=0;i<len;i++){
temp =s[i];
if(top == -1){//栈为空时
top++;
s[top] = temp;
}else{
//( [ { 入栈
if(temp=='('||temp=='['||temp=='{'){
top++;
s[top] = temp;
}else {
if(temp==')'){
if(s[top]=='(')
top--;
else
return false;
}else if(temp==']'){
if(s[top]=='[')
top--;
else
return false;
}else if(temp=='}'){
if(s[top]=='{')
top--;
else
return false;
}
}
}
}
if(top==-1){
return true;
}
return false;
}
标签:返回,相爱,nums,int,相杀,元素,数组,letcode,输入
From: https://www.cnblogs.com/ZarkY/p/17172462.html