栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

算法练习.

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

算法练习.

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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867023.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号