O*******d 发帖数: 20343 | 1 把答案贴在下边
void reverseString(char *st)
{
int len;
char *ptr1, *ptr2, *ptr3;
char c;
len = strlen(st);
ptr1 = st;
ptr2 = st + len - 1;
/* first pass. Reverse entire string */
while(ptr2 > ptr1)
{
c = *ptr1;
*ptr1 = *ptr2;
*ptr2 = c;
ptr1++;
ptr2--;
}
/* second pass. Reverse each word */
ptr1 = ptr3 = st;
while(ptr1 < (st + len))
{
while(ptr3 < (st + len) && *ptr3 != ' ')
ptr3++;
|
|
b***i 发帖数: 3043 | 2 我觉得, 你前面ptr1是一个智能指针对象实例,然后构造一个A的实例,让ptr1来管理
,那么A现在的计数为1。当你把 ptr1通过push_back试图放到ptrList里面时,ptrList
[0]出现一个智能指针的实例,把A实例的计数加到2.
等你删掉ptr1时,虽然ptr1.use_count是0,那是因为你把它删掉了,所以它不知道指
向哪个对象了。这时ptrList[0]还是指向那个A的对象。
另一个例子,如果你把ptr1向ptrList1和ptrList2分别push_back,会发现ptr1.use_
count为3,如果删掉ptr1,这时查看ptrList1[0]和ptrList2[0],会发现他们都是2.这
两个数组里面存储着新的不同的智能指针对象,但是是管理同一个对象A。这两个智能
指针对象是在push_back的时候构造的,但是A的内容没有复制。
你原来的目的,不用smart pointer,也可以通过编译,只需要在B.h里面
class A;//必须对称,A.h里面要有class B;
class B{定义,不要实现};
.cpp include 两个.h,实现... 阅读全帖 |
|
m*****g 发帖数: 226 | 3 void removeDuplicated(node* ll)
{
if(!ll) return;
if(!ll->next) return;
node* ptr1, ptr2;
ptr1 = ll;
ptr2 = ptr1->next;
while(1)
{
if(ptr1->v == ptr2->v)
{
while(ptr1->v == ptr2->v)
{
node* ptr3 = ptr2->next;
llDeleteNode(ll,ptr3);
ptr2 = ptr3;
if(!ptr2) break;
}
llDeleteNode(ll, ptr1);
if(!ptr2) return;
if(!ptr2->next... 阅读全帖 |
|
|
a**d 发帖数: 64 | 5 第一题的java答案抄了一个,运行通过的。
https://github.com/nagajyothi/InterviewBit/blob/master/DynamicProgramming/
AvgSet.java
各路大神看看还有没有更优解。
// Sum_of_Set1 / size_of_set1 = total_sum / total_size, and so, Sum_of_Set1
= size_of_set1 * total_sum / total_size.
// Now we can just iterate on size_of_set1, and we would know the required
Sum_of_Set1.
static List res = new ArrayList();
static boolean[][][] dp;
public static List> partitionAverage(int[] num) {
List阅读全帖 |
|
d****n 发帖数: 1637 | 6 ptr1=ptr2=start;
i=0;
while((i++)<=m) ptr1=ptr1->next();
while(ptr1->next()!=NULL) {
ptr1=ptr1->next() ;
ptr2=ptr2->next();
}
Still two loops, haha.
but the first loop is constant. |
|
x*******6 发帖数: 262 | 7 16题就是career cup上面linkedlist那节题吧,两个ptr1和2,ptr1一次向前一个node
,ptr2一次向前2个node,每次判断ptr1和ptr2是非重合,重合了就是有环。如果重合
,将ptr1重设到firstnode,ptr2变成每次向前一个node,两个ptr再次重合时的那个
node就是环首位相交的node |
|
g*********s 发帖数: 1782 | 8 my_class在某个头文件里定义,有一个method叫print()。
typedef my_class *my_class_p;
my_class *ptr1;
my_class_p ptr2;
ptr1 = new my_class;
ptr2 = ptr1;
在gdb里,做ptr1->print(),没问题。做ptr2->print(),返回错误信息。
但是如果做((my_class *)ptr2))->print(),结果也正确。
这是怎么回事呢?是不是和文件包含顺序有关?确实是一个比较复杂的系统里发现的问
题。 |
|
d****n 发帖数: 1637 | 9 恩,一般来说就是这么找。
但是你看看楼主开始提出的做法,两个指针的approach, 我觉得更smart 一些。
你的做法:
ptr1=start;
n=0;
while(*(++ptr1)) n++;
ptr2=start;
i=0;
while((i++)<=(n-m)) ptr2++;
楼主的第一个approach:
ptr1=start+m;
ptr2=start;
while(*(ptr1++) && *(ptr2++)) ;
两种算法都是ptr2是结果。(忽略边界判断)
我觉得就指针操作而言,楼主的提法更快,coding style 更好些。
我没看明白楼主优化的做法,貌似和第一个一样。
ps.不喜欢2个loop的approach |
|
m*********a 发帖数: 3299 | 10 知道为啥下面会是这样的结果吗?
定义
char *ptr1[10];
可以
ptr1[0]="hello";
ptr1[1]="world";
...
...
ptr[9]="end";
可以看着10个rows的二维矩阵
但是无法进行ptr1[0][0]='X';
如果要进行这样的操作
可以定义
char (*ptr2)[10]
然后就可以进行 ptr2[0][0]='x'了。
但是无法进行
ptr2[0]="hello";
ptr2[1]="world"; |
|
|
r*c 发帖数: 167 | 12 RK肯定好写些,尽管它比KMP要慢不少。
前些天看到一个帖子,把RK的实现搞得特麻烦。下面贴个改进的,其中hash function
可替换,只要把各个char的信息都用到就好了。
class RobinKarpSolution
{
public:
char *strStr(char *haystack, char *needle) {
int nHSLen = strlen(haystack), nNDLen = strlen(needle);
if(nNDLen > nHSLen) return NULL;
int h_hash, n_hash = hashAString(needle, nNDLen, 0);
for(int i = 0; i <= nHSLen-nNDLen; ++i){
h_hash = hashAString(haystack, nNDLen, i);
if(n_hash == h_hash) {
if(!C... 阅读全帖 |
|
b********6 发帖数: 35437 | 13 保留或剔除重复结果太容易了
你要找的是在list1里出现但是不在list2里的,在list1, list2里各放一个指针ptr1,
ptr2,如果ptr1大于ptr2就增加ptr2 |
|
b**u 发帖数: 1206 | 14 malloc ptr1 for file1, malloc ptr2 for file2,...
link list for ptr1, ptr2,... |
|
b**********r 发帖数: 1 | 15 Hi, guys,
I am new to C#.
but in C++, there are a lot of function of function usage, how is done in C#?
for example:
double f(double a);
double g(double a);
typedef double (* ptr_func)(double a);
double func_integrator( ptr_func ptr1, double x0, double x1, double
precision);
this should be a very common use, is it still possible in C#? |
|
O*******d 发帖数: 20343 | 16 64bit的windows上,
int d = ptr1 - ptr2是错误的。 |
|
b***i 发帖数: 3043 | 17 我觉得应该是指针还有效的才能看到计数。
试验两句就懂了
在第一个{}里面去掉把ptr2加入的语句。可以看到,ptr2所指向的对象在reset那里被
销毁了
然后第二个{}那里,
std::cout << " but list1 has " << ptrList[0].use_count() << std::endl;
虽然ptr1不能访问那个A对象实例了,在vector哪里呢。所以不能执行析构函数。
那个不用smartptr的例子呢? |
|
p***o 发帖数: 1252 | 18 ptr1都reset了, 自然相当于空指针, use_count是0。
你把vector里面那两个指针的use_count打出来就明白了。 |
|