题目描述:给定一个整形数组,数组是升序排列的,可能存在负数,统计数组中所有不同绝对值的元素的个数。
思路:设置两个指针,分别指向数组的第一个元素和最后一个元素,可以看做是两个有序数组的合并过程(从大到小合并)。
#include<iostream> #include<vector> using namespace std; int GetNumberWithDifferentAbsVal(vector<int> num) { int len = num.size(); if (len <= 0) return 0; int p1 = 0, p2 = len - 1; int curNum; int cnt = 0; if (abs(num[p2]) > abs(num[p1])) { curNum = abs(num[p2]); --p2; } else { curNum = abs(num[p1]); ++p1; } while (p2 >= p1) { if (abs(num[p2]) > abs(num[p1])) { if (abs(num[p2]) == curNum) ++cnt; curNum = abs(num[p2]); --p2; } else { if (abs(num[p1]) == curNum) ++cnt; curNum = abs(num[p1]); ++p1; } } return len - cnt; } int main() { int a[13] = { -5,-4,-3,-3,-2,-2,0,0,2,2,9,9,9 }; int b[10] = { -1,0,1,1,2,3,4,5,6,7 }; int c[10] = { 1,1,2,2,3,3,4,4,5,5 }; int d[10] = { -2,-1,0,0,1,1,1,2,3,3 }; vector<int> numbers(d, d + 10); cout<< GetNumberWithDifferentAbsVal(numbers)<<endl; return 0; }