算法练习.

算法练习.,第1张

1.买卖股票的最佳时机

题目要求获得最大利益,所以我的想法是,只要前一天股市价格比后一天低,我们就可以理解为再前一天买入,在后一天卖出,这样就能获得利益,然后数组从前到后,每间隔的两天都进行此 *** 作,就可以保证获得的利润最大

int maxProfit(int* prices, int pricesSize){
	int i, j, sum = 0;
	if(prices==0||pricesSize==0){
		return 0;
	}
	for(i = 0;iprices[j]){
				break;
			}
			else{
				sum += prices[j] - prices[i];
				i = j;
			}
		}
	}
	return sum; 
}

2.整数反转

在读到这个题目时,我的第一个想法是,需要旋转的数字存进一个数组,但是由于我们不知道输入数字的长度,所以可以将数字倒着存进去,这一步同时也实现了将数字翻转过来,再获得最后反转后的数字时就可以直接按顺序计算,但是在输出时需要考虑反转后的数字会不会超过题目规定范围 

int reverse(int x){
	int a[11];
	int i = 0;
  long long temp = 0;
	while(x!=0){
		a[i] = x % 10;
		x = x / 10;
		i++;
	}
	for(int j = 0;jpow(2,31)-1||temp

在看了题解和咨询他人后,发现可以不用利用数组,每次都进行取当前数字最后一位,再按照倍数关系,与当前反转后的数字相加,同时也需要考虑最后的范围

int reverse(int x){	
    long long int r, temp = 0;
	while(x!=0){
		r = x % 10;
		temp = temp * 10 + r;
		x = x /10;
		if(temp>pow(2,31)-1||temp

3.验证回文串

这道题目输入可能中间会有符号,大小写字母,数字,在利用ASCⅡ码判断时,需要保证大小写一致,并且去掉字符串中符号,先遍历一遍字符串,将其中大写转化为小写,去掉标点,从前到后存入一个新字符串中,然后定义两个指针,当左指针小于右指针时,同时向中间判断指针所指的字符是否一样,存在不一样就返回false

bool isPalindrome(char * s){
	int len1 = strlen(s), cnt = 0;
	char t[len1];
	if(s==0){
		return false;
	}
	for(int i = 0;i=97&&s[i]<=122){
			t[cnt++] = s[i];
		}
		if(s[i]>=65&&s[i]<=90){
			t[cnt++] = s[i] + 32;
		}
        if(s[i]>=48&&s[i]<=57){
            t[cnt++] = s[i];
        }
	}
	int i = 0, j = cnt-1;
    while(i

 4.有效的字母异位词

在判断时,当两个字符串长度不相等时,直接返回false,把两个字符串中的每个字符出现的次数用两个数组记录下来,再判断两个数组中相同字符出现次数是否相同

bool isAnagram(char * s, char * t){
    int len1 = strlen(s), len2 = strlen(t);
    if(len1!=len2){
    	return false;
	}
    int a[256] = {0}, b[256] = {0};
    for (int i = 0;i

 5.删除链表的倒数第N个节点

 定义两个指针,让第一个指针先走N步,如果第一个指针为空,说明N正好为链表长度,所以删除倒数第N个就是删除第一个,当第一个指针不为空时,再让两个指针同时向后移,当第一个指针指向空时,此时第二个指针所指的结点就是需要删除的结点

struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
    int i;
    struct ListNode *p1=head,*p2=head;
    for(i=0;inext;
    while(p1!=NULL&&p1->next!=NULL){
        p1=p1->next;
        p2=p2->next;
    }
    if(p1==NULL) head=head->next;
    else p2->next=p2->next->next;
    return head;
}

6.有效的括号

 这道题用到栈的思想,因为有效的括号必须是前括号开始,后括号结尾,而且交错的括号例如(【)】这样的括号对是错的,所以当遇到前括号把与他相匹配的后括号存进新数组中,当遇到第一个后括号时,与新数组中最末尾的元素比较,一旦不匹配,就输出false,在遍历一遍后,如果新数组的下标未到达0,证明前后括号数量不同,也返回false

bool isValid(char * s){
    int len = strlen(s), cnt = 0;
    char a[10001];
    if(len%2 == 1){
        return false;
    }
    for(int i = 0;i

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/874771.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)