oj

力扣 OJ 234. 回文链表

蹲街弑〆低调 提交于 2020-02-09 09:19:48
题目: 请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? 代码: int GetLength(ListNode *p)//获取链表长度 { int ans = 0; while (p) { ans++; p = p->next; } return ans; } ListNode * Reverse(ListNode *p)//链表反转,返回新的head { if (p == NULL)return p; ListNode * q1; ListNode * q2; q1 = p->next, p->next = NULL; while (q1) { q2 = q1->next, q1->next = p, p = q1, q1 = q2; } return p; } class Solution { public: bool isPalindrome(ListNode* head) { if (head == NULL)return true; int length = GetLength(head); length = (length - 1) / 2; ListNode* p = head; while

力扣 OJ 9. 回文数

感情迁移 提交于 2020-02-09 09:18:23
题目: 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 示例 3: 输入: 10 输出: false 解释: 从右向左读, 为 01 。因此它不是一个回文数。 进阶: 你能不将整数转为字符串来解决这个问题吗? 代码: class Solution { public: bool isPalindrome(int x) { if (x < 0)return false; vector<int>num; while (x) { num.insert(num.end(), x % 10); x /= 10; } int len = num.size(); for (int i = 0, j = len - 1; i < j; i++, j--) { if (num[i] - num[j])return false; } return true; } }; 来源: CSDN 作者: csuzhucong 链接: https://blog.csdn.net/nameofcsdn/article/details/104224948

力扣 OJ 342. 4的幂

自古美人都是妖i 提交于 2020-02-09 09:17:57
题目: 给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。 示例 1: 输入: 16 输出: true 示例 2: 输入: 5 输出: false 进阶: 你能不使用循环或者递归来完成本题吗? 代码: class Solution { public: bool isPowerOfFour(int n) { if (n <= 0)return false; while (n % 4 == 0)n /= 4; return n == 1; } }; 来源: CSDN 作者: csuzhucong 链接: https://blog.csdn.net/nameofcsdn/article/details/104221338

力扣 OJ 292. Nim 游戏

孤街浪徒 提交于 2020-02-09 03:26:44
题目: 你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。 你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。 示例: 输入: 4 输出: false 解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛; 因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。 这应该是最简单的题目了,从开始读题到AC都不到一分钟。 代码: class Solution { public: bool canWinNim(int n) { return n%4; } }; 来源: CSDN 作者: csuzhucong 链接: https://blog.csdn.net/nameofcsdn/article/details/104219866

杭电Oj刷题(2040)

折月煮酒 提交于 2020-02-09 03:24:54
亲和数 题目描述: 古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为: 1+2+4+5+10+11+20+22+44+55+110=284。 而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。 你的任务就编写一个程序,判断给定的两个数是否是亲和数 Input 输入数据第一行包含一个数M,接下有M行,每行一个实例,包含两个整数A,B; 其中 0 <= A,B <= 600000 ; Output 对于每个测试实例,如果A和B是亲和数的话输出YES,否则输出NO。 Sample Input 2 220 284 100 200 Sample Output YES NO 通过答案: #include <stdio.h> int main () { int m,i,j,A,B,sum1,sum2; while(scanf("%d",&m)!=EOF) { for(i=0;i<m;i++){ sum1=0;sum2=0; scanf("%d %d",&A,&B); for(j=1;j<A;j++){ //约数,又称因数。 if(A%j==0){ //整数a除以整数b(b≠0) 除得的商正好是整数而没有余数

力扣 OJ 338. 比特位计数

家住魔仙堡 提交于 2020-02-08 19:18:08
题目: 给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。 示例 1: 输入: 2 输出: [0,1,1] 示例 2: 输入: 5 输出: [0,1,1,2,1,2] 进阶: 给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗? 要求算法的空间复杂度为O(n)。 你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __builtin_popcount)来执行此操作。 代码: class Solution { public: vector<int> countBits(int num) { vector<int>ans; ans.insert(ans.end(), 0); for (int i = 1; i <= num; i++) { ans.insert(ans.end(), i % 2 + ans[i / 2]); } return ans; } }; 来源: CSDN 作者: csuzhucong 链接: https://blog.csdn.net/nameofcsdn/article/details/104220855

杭电Oj刷题(2039)

ぐ巨炮叔叔 提交于 2020-02-08 17:23:59
三角形 题目描述: 给定三条边,请你判断一下能不能组成一个三角形。 Input 输入数据第一行包含一个数M,接下有M行,每行一个实例,包含三个正数A,B,C。其中A,B,C <1000; Output 对于每个测试实例,如果三条边长A,B,C能组成三角形的话,输出YES,否则NO。 Sample Input 2 1 2 3 2 2 2 Sample Output NO YES 通过答案: #include <stdio.h> int main () { int m,i; double A,B,C; while(scanf("%d",&m)!=EOF) { for(i=0;i<m;i++){ scanf("%lf %lf %lf",&A,&B,&C); if((A+B>C)&&(A+C>B)&&(B+C>A)){ //判三角形:任意两边之和大于第三边 printf("YES\n"); }else{ printf("NO\n"); } } } return 0; } 来源: CSDN 作者: Lucy girl 链接: https://blog.csdn.net/ZhangShaoYan111/article/details/104224532

力扣 OJ 461. 汉明距离

时光总嘲笑我的痴心妄想 提交于 2020-02-08 15:47:19
题目: 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。 给出两个整数 x 和 y,计算它们之间的汉明距离。 注意: 0 ≤ x, y < 231. 示例: 输入: x = 1, y = 4 输出: 2 解释: 1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑ 上面的箭头指出了对应二进制位不同的位置。 代码: class Solution { public: int hammingWeight(uint32_t n) { int ans = 0; while (n) { n ^= (n&(-n)); ans++; } return ans; } int hammingDistance(int x, int y) { return hammingWeight(x^y); } }; 来源: CSDN 作者: csuzhucong 链接: https://blog.csdn.net/nameofcsdn/article/details/104220900

力扣 OJ 33. 搜索旋转排序数组

孤者浪人 提交于 2020-02-06 08:54:28
题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。 示例 1: 输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4 示例 2: 输入: nums = [4,5,6,7,0,1,2], target = 3 输出: -1 代码: class Solution { public: int search(vector<int>& nums, int target) { if (nums.empty())return -1; int low = 0, high = nums.size() - 1, mid; while (low < high) { mid = (high + low) / 2; if (nums[mid] == target)return mid; if (nums[mid] >= nums[low]) { if (target >= nums[low] && target < nums[mid])high = mid - 1; else low = mid

OJ:一个output-limit-exceed的原因

╄→гoц情女王★ 提交于 2020-02-05 18:28:26
最近又开始写一些oj,主要还是想应对机试。其他且不论,今天遇到的这个问题先记录一下,日后在分析。 原本代码 #include<stdio.h> #include<math.h> int main(){ int x,y; while(scanf("%d%d",&x,&y)){ if(x>y){ int temp = x; x = y; y = temp; } double k = (1+sqrt(5))/2; int a = y-x; if(x==(int)(k*a)) printf("0\n"); else printf("1\n"); } return 0; } ac代码 #include<iostream> #include<cmath> using namespace std; int main(){ int x,y; while(cin>>x>>y){ if(x>y){ int temp = x; x = y; y = temp; } float k = (1+sqrt(5))/2; int a = y-x; if(x==(int)(k*a))printf("0\n"); else printf("1\n"); } return 0; } 查找原因是 scanf不判断是否读到EOF while(cin>>n)没有问题 while(scanf("%d",&n)!=EOF